{"id":69,"date":"2026-10-16T08:00:00","date_gmt":"2026-10-16T08:00:00","guid":{"rendered":"https:\/\/prensabot.com\/blog\/?p=69"},"modified":"2026-10-09T23:04:53","modified_gmt":"2026-10-09T23:04:53","slug":"del-caos-silencioso-al-control-total-como-domamos-las-colas-de-laravel","status":"publish","type":"post","link":"https:\/\/prensabot.com\/blog\/del-caos-silencioso-al-control-total-como-domamos-las-colas-de-laravel\/","title":{"rendered":"Del caos silencioso al control total: c\u00f3mo domamos las colas de Laravel"},"content":{"rendered":"<p>El 12 de septiembre de 2026 marc\u00f3 un punto de inflexi\u00f3n en la infraestructura de PrensaBot. Lo que comenz\u00f3 como una sospecha \u2013feeds que no se actualizaban a tiempo\u2013 se convirti\u00f3 en la exposici\u00f3n de una peligrosa ilusi\u00f3n: asumir que porque un cron est\u00e1 configurado en cPanel, el trabajo se est\u00e1 ejecutando correctamente. El equipo descubri\u00f3, con horas de retraso, que procesos se congelaban en silencio o que m\u00faltiples ejecuciones compet\u00edan entre s\u00ed, bloqueando operaciones cr\u00edticas.<\/p>\n<h2>La anatom\u00eda del problema: cuando los procesos se devoran<\/h2>\n<p>El escenario era complejo. En un entorno de hosting compartido donde no se pod\u00eda ejecutar un demonio persistente como Supervisor, los trabajos programados (crons) eran la columna vertebral. Sin embargo, la falta de protecci\u00f3n generaba condiciones de carrera. Un proceso anterior pod\u00eda quedar congelado, consumiendo indefinidamente un lock de base de datos, mientras que dos ejecuciones simult\u00e1neas de un mismo comando compet\u00edan por los mismos recursos, colapsando tablas de jobs y deteniendo el flujo de redacci\u00f3n automatizada.<\/p>\n<p>La soluci\u00f3n no pod\u00eda depender \u00fanicamente de logs de error de Apache o LiteSpeed, inaccesibles o cr\u00edpticos para un operador no t\u00e9cnico. La misi\u00f3n era clara: construir un sistema donde fuera imposible fallar en silencio. Si algo se trababa, deb\u00eda &quot;gritar&quot; de inmediato.<\/p>\n<h2>La arquitectura de la confiabilidad: locks, heartbeats y workers disciplinados<\/h2>\n<p>Tras probar diferentes enfoques, el equipo implement\u00f3 una estrategia multicapa que transform\u00f3 la operaci\u00f3n:<\/p>\n<ul>\n<li>\n<p><strong>Worker disciplinado:<\/strong> Se configur\u00f3 el comando <code>queue:work --stop-when-empty --max-jobs=20 --max-time=180<\/code>. Esta instrucci\u00f3n permite que un worker procese jobs de la cola de Laravel de manera controlada y luego finalice, ideal para entornos sin demonios persistentes.<\/p>\n<\/li>\n<li>\n<p><strong>Lockfile a nivel de sistema:<\/strong> Se cre\u00f3 un archivo de bloqueo en <code>\/tmp\/pb_worker.lock<\/code>. Este mecanismo a nivel de sistema operativo previene ejecuciones solapadas del mismo proceso, garantizando que solo una instancia corra a la vez.<\/p>\n<\/li>\n<li>\n<p><strong>Panel de System Operations:<\/strong> Se desarroll\u00f3 una pantalla dentro del panel administrativo de PrensaBot (construido con Filament) que muestra en tiempo real el \u00faltimo latido (*heartbeat*), el estado de las colas y las alertas del sistema. Es un electrocardiograma de la infraestructura.<\/p>\n<\/li>\n<\/ul>\n<h2>El aprendizaje clave: visibilidad sobre fe<\/h2>\n<p>El principal cambio de paradigma fue entender que la confiabilidad de un sistema no reside en que nunca falle \u2013eso es una utop\u00eda\u2013, sino en que sea imposible que falle en silencio. La observabilidad pas\u00f3 de ser un lujo a una necesidad fundamental. Hoy, cualquier desviaci\u00f3n en el ritmo de procesamiento o un lock retenido m\u00e1s de lo esperado se manifiesta de inmediato en el panel de control, permitiendo una intervenci\u00f3n r\u00e1pida antes de que impacte en la producci\u00f3n de contenidos.<\/p>\n<p>Esta arquitectura, documentada en los ADR 008 y 009 internos, sienta las bases para un sistema m\u00e1s resiliente. Demuestra que incluso en entornos con restricciones, como un hosting compartido, es posible implementar mecanismos robustos de control y monitoreo, reemplazando la fe ciega en los scripts por datos concretos y ojos siempre abiertos sobre la redacci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El equipo t\u00e9cnico de PrensaBot revela la arquitectura que pas\u00f3 de la fe ciega en crons a un sistema observable con locks at\u00f3micos y monitoreo en tiempo real, eliminando fallas silenciosas en producci\u00f3n.<\/p>\n","protected":false},"author":2,"featured_media":68,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-69","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arquitectura-y-backend"],"_links":{"self":[{"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/posts\/69","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/comments?post=69"}],"version-history":[{"count":1,"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/posts\/69\/revisions"}],"predecessor-version":[{"id":70,"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/posts\/69\/revisions\/70"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/media\/68"}],"wp:attachment":[{"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/media?parent=69"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/categories?post=69"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prensabot.com\/blog\/wp-json\/wp\/v2\/tags?post=69"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}