Conectores RSS y circuit breaker: fuentes sin API

admin · 2 min

El conector RSS es el más utilizado del stack: cualquier medio que publique un feed Atom o RSS estándar puede integrarse sin código adicional. El reto no es parsear el XML, sino hacerlo de forma resiliente cuando algunas fuentes fallan de forma intermitente.

Circuit breaker por feed

Cada URL de feed tiene su propio circuit breaker con tres estados:

  • CLOSED — funcionando con normalidad.
  • OPEN — tras max_failures fallos consecutivos, el feed se salta durante cooldown_seconds (por defecto 300 s).
  • HALF_OPEN — expirado el cooldown, se permite un intento. Si tiene éxito, vuelve a CLOSED; si falla, vuelve a OPEN.
class FeedCircuitBreaker:
    def __init__(self, max_failures=5, cooldown_seconds=300.0):
        ...

    def should_skip(self, feed_url: str) -> bool:
        # True si el feed está en estado OPEN
        ...

    def record_success(self, feed_url: str) -> None: ...
    def record_failure(self, feed_url: str, error: str = "") -> None: ...

El estado de todos los circuit breakers es visible en /health/scheduler, lo que permite saber qué feeds están caídos y cuánto tiempo llevan en cooldown sin entrar en los logs del servidor.

Normalización al modelo interno

Cada ítem RSS se normaliza al modelo Document compartido por todos los conectores. Los campos mínimos obligatorios son title, url, published_at y source_id. El resto (autor, categorías, descripción, imagen) se rellena si el feed los incluye.

Esto permite que el resto del pipeline (deduplicación, NLP, señales) sea independiente de la fuente de origen.

admin

Editor en D4R.