¿Está buscando un sistema de colas? ¿O tal vez estás buscando uno mejor? ¡Aquí está toda la información que necesita!
Los sistemas de cola son el secreto mejor guardado del desarrollo backend.
Sin intentar escribir un poema en elogio de los sistemas de colas, diría que un desarrollador de backend junior se convierte en un desarrollador de backend de nivel medio después de aprender a integrar las colas en el sistema. Las colas mejoran la experiencia del cliente (veremos cómo), reducen la complejidad y mejoran la confiabilidad en un sistema.
Claro, para aplicaciones web muy simples con tráfico casi nulo y sitios web de folletos, las colas pueden ser un problema general (o incluso imposible de instalar si está en un entorno de alojamiento compartido), pero las aplicaciones no triviales se beneficiarán de los sistemas de cola, y las aplicaciones grandes son imposibles sin las colas involucradas.
Antes de comenzar, un descargo de responsabilidad: si ya se siente cómodo con los sistemas de colas y desea comparar las diversas opciones, las siguientes secciones introductorias le inducirán a dormir mucho. 🙂 Así que siéntete libre de adelantarte. Las secciones introductorias están destinadas a aquellos que solo tienen una idea confusa de los sistemas de cola o que simplemente han escuchado el nombre de pasada.
¿Qué es un sistema de colas?
Comencemos por comprender qué es una cola.
Una cola es una estructura de datos en informática que imita, bueno, las colas del mundo real que vemos a nuestro alrededor. Si va a un mostrador de boletos, por ejemplo, notará que tendrá que pararse al final de la cola, mientras que la persona al comienzo de la cola obtendrá el boleto primero. Esto es lo que también llamamos el fenómeno del “primero en llegar, primero en ser servido”. En ciencias de la computación, es posible escribir programas que almacenen sus tareas de esta manera en una cola, procesándolas una por una según el mismo orden de llegada.
Tenga en cuenta que la cola no realiza ningún procesamiento real por sí misma. Es solo un tipo de almacenamiento temporal donde las tareas esperan hasta que algo las recoja. Si todo esto suena un poco demasiado abstracto, no se preocupe. Eso is un concepto abstracto, pero veremos ejemplos claros en la siguiente sección. 🙂
¿Por qué necesita sistemas de colas?
Sin entrar en una descripción muy extensa, diría que la principal necesidad de los sistemas de cola se debe al procesamiento en segundo plano, la ejecución en paralelo y la recuperación de fallas. Veamos estos con la ayuda de ejemplos:
Procesamiento en segundo plano
Supongamos que está ejecutando un marketing de comercio electrónico campaña en la que el tiempo es esencial y que su aplicación está diseñada para que envíe un correo electrónico de confirmación justo antes de que el cliente complete el pago y se le muestre la página de "gracias". Si el servidor de correo al que se está conectando no funciona, la página web simplemente morirá, rompiendo la experiencia del usuario.
¡Imagínese la gran cantidad de solicitudes de soporte que recibiría! En este caso, es mejor enviar esta tarea de envío de correo electrónico a una cola de trabajos y mostrarle al cliente la página de éxito.
Ejecución paralela
Muchos desarrolladores, especialmente aquellos que en su mayoría codifican aplicaciones más simples y con poco tráfico, tienen el hábito de usar trabajos cron para procesamiento en segundo plano. Esto está bien hasta que el tamaño de la entrada sea tan grande que no se pueda borrar. Por ejemplo, suponga que tiene un trabajo cron que compila informes analíticos y los envía por correo electrónico a los usuarios y que su sistema puede procesar 100 informes por minuto.
Tan pronto como su aplicación crezca y comience a recibir más de 100 solicitudes por minuto en promedio, comenzará a retrasarse cada vez más y nunca podrá completar todos los trabajos.
En un sistema de colas, esta situación se puede evitar configurando varios trabajadores, cada uno de los cuales puede elegir un trabajo (que contiene 100 informes para realizar cada uno) y trabajar en paralelo para terminar la tarea mucho, mucho antes.
Recuperación de fallas
Generalmente, no pensamos en el fracaso como desarrolladores web. En cierto modo, damos por sentado que nuestros servidores y las API que usamos siempre estarán en línea. Pero la realidad es diferente: las interrupciones de la red son demasiado comunes y las excelentes API en las que confía pueden estar inactivas debido a problemas de infraestructura (antes de decir "¡yo no!", No olvide el interrupción masiva de Amazon S3). Entonces, volviendo al ejemplo de informes, si parte de la generación de su informe requiere que se conecte a la API de pagos y esa conexión no funciona durante 2 minutos, ¿qué sucede con los 200 informes que fallaron?
Sin embargo, los sistemas de colas implican una sobrecarga considerable. La curva de aprendizaje es bastante empinada a medida que ingresa a un dominio completamente nuevo, la complejidad de su aplicación y la implementación aumenta y los trabajos en cola no siempre se pueden controlar con un 100% de precisión. Dicho esto, hay situaciones en las que crear una aplicación sin colas simplemente no es posible.
Con eso fuera del camino, echemos un vistazo a algunas de las opciones comunes entre los backends / sistemas de cola de hoy.
Redis
Redis se conoce como un almacén de valores clave que simplemente almacena, actualiza y recupera cadenas de datos sin conocimiento de la estructura de los datos. Si bien eso podría haber sido cierto antes, hoy Redis tiene estructuras de datos eficientes y muy útiles como listas, conjuntos ordenados e incluso un sistema Pub-Sub, lo que lo hace muy deseable para las implementaciones de colas.
Las ventajas de Redis son:
- Base de datos completamente en memoria, lo que resulta en lecturas / escrituras más rápidas.
- Muy eficiente: puede admitir fácilmente más de 100,000 operaciones de lectura / escritura por segundo.
- Esquema de persistencia altamente flexible. Puede optar por un rendimiento máximo a costa de una posible pérdida de datos en caso de fallas o configurarlo en modo totalmente conservador para sacrificar el rendimiento por la coherencia.
- Clústeres compatibles desde el primer momento
Tenga en cuenta que Redis no tiene abstracciones de mensajería / cola / recuperación, por lo que debe usar un paquete o construir un sistema liviano usted mismo. Un ejemplo es que Redis es el backend de cola predeterminado para Laravel Framework PHP, donde los autores del marco han implementado un planificador.
Aprendiendo Redis es fácil.
RabbitMQ
Hay algunas diferencias sutiles entre Redis y RabbitMQ, así que primero sacámoslos del camino.
En primer lugar, RabbitMQ tiene un rol más especializado y bien definido, por lo que se creó para reflejar eso: mensajería. En otras palabras, su punto dulce es actuar como intermediario entre dos sistemas, lo que no es el caso de Redis, que actúa como una base de datos. Como resultado, RabbitMQ proporciona algunas funciones más que faltan en Redis: enrutamiento de mensajes, reintentos, distribución de carga, etc.
Si lo piensa, las colas de tareas también se pueden considerar como un sistema de mensajería, donde el programador, los trabajadores y los "remitentes" de trabajos pueden considerarse entidades que participan en el paso de mensajes.
RabbitMQ tiene las siguientes ventajas:
- Mejores abstracciones para el paso de mensajes, lo que reduce el trabajo a nivel de aplicación si lo que necesita es el paso de mensajes.
- Más resistente a fallas y cortes de energía (que Redis, al menos por defecto).
- Soporte de agrupación y federación para implementaciones distribuidas.
- Herramientas útiles para administrar y monitorear sus implementaciones.
- Soporte para prácticamente todos los lenguajes de programación no triviales que existen.
- Implementación con la herramienta que elijas (Docker, Chef, Puppet, etc.).
¿Cuándo usar RabbitMQ? Yo diría que es una gran opción cuando sabe que necesita usar el paso de mensajes asincrónico pero no está listo para abordar la enorme complejidad de algunas de las otras opciones de cola en esta lista (ver más abajo).
ActiveMQ
Si está en el espacio empresarial (o está creando una aplicación altamente distribuida y a gran escala) y no quiere tener que reinventar la rueda todo el tiempo (y cometer errores en el camino), ActiveMQ vale la pena mirar.
Aquí es donde sobresale ActiveMQ:
- Está implementado en Java y, por lo tanto, tiene una integración de Java realmente ordenada (sigue el estándar JMS).
- Soporta múltiples protocolos: AMQP, MQTT, STOMP, OpenWire, etc.
- Maneja seguridad, enrutamiento, caducidad de mensajes, análisis, etc., listo para usar.
- Soporte integrado para patrones de mensajería distribuida populares, lo que le ahorra tiempo y errores costosos.
Eso no quiere decir que ActiveMQ esté disponible solo para Java. Tiene clientes para Python, C / C ++, Node, .Net y otros ecosistemas, por lo que no debería haber preocupaciones por un posible colapso en el futuro. Además, ActiveMQ se basa en estándares completamente abiertos y crear sus propios clientes ligeros debería ser fácil.
Todo lo dicho y hecho, tenga en cuenta que ActiveMQ es solo un corredor y no incluye un backend. Aún necesitaría usar uno de los backends compatibles para almacenar los mensajes. Lo incluí aquí porque no está vinculado a un lenguaje de programación en particular (como otras soluciones populares como Celery, Sidekiq, etc.)
Amazon MQ
Amazon MQ merece una mención rápida pero importante aquí. Si cree que ActiveMQ es la solución ideal para sus necesidades pero no quiere ocuparse de la construcción y el mantenimiento de la infraestructura usted mismo, Amazon MQ ofrece un servicio administrado para hacerlo. Es compatible con todos los protocolos que utiliza ActiveMQ (no hay ninguna diferencia en las características), ya que utiliza el propio ActiveMQ bajo la superficie.

La ventaja es que es un servicio administrado, por lo que no tiene que preocuparse por nada más que por usarlo. Tiene aún más sentido para aquellas implementaciones que están en AWS, ya que puede aprovechar otros servicios y ofertas directamente desde su implementación (transferencias de datos más rápidas, por ejemplo).
Amazon SQS
No podemos esperar que Amazon se quede callado cuando se trata de piezas de infraestructura críticas, ¿verdad? 🙂
Y asi tenemos Amazon SQS, que es un servicio de cola simple y completamente alojado (literalmente) del conocido gigante AWS. Una vez más, las diferencias sutiles son importantes, así que tenga en cuenta que SQS no tiene el concepto de transmisión de mensajes. Al igual que Redis, es un backend simple para aceptar y distribuir trabajos en colas.
Entonces, ¿cuándo le gustaría utilizar Amazon SQS? He aquí algunas razones:
- Eres un fanático de AWS y no tocarás nada más (honestamente, hay mucha gente así, y creo que no hay nada de malo en eso).
- Necesita una solución alojada, así que asegúrese de que la tasa de fallas sea cero y no se pierda ninguno de los trabajos.
- No desea crear un clúster y tener que supervisarlo usted mismo. O peor aún, tener que crear herramientas de monitoreo cuando podría estar usando ese tiempo para hacer un desarrollo productivo.
- Ya tiene inversiones sustanciales en la plataforma AWS y permanecer encerrado tiene sentido comercial.
- Desea un sistema de cola simple y enfocado sin ninguna de las pelusas asociadas con el paso de mensajes, protocolos y todo eso.
Con todo, Amazon SQS es una opción sólida para cualquiera que desee incorporar colas de trabajos en su sistema y no tener que preocuparse por instalar / monitorear cosas por sí mismos.
Beanstalkd
habichuelas mágicas ha existido durante mucho tiempo y es un backend rápido, fácil y probado en la batalla para la cola de trabajos. Hay algunas características de Beanstalkd que lo diferencian considerablemente de Redis:
- Es estrictamente un sistema de cola de trabajos y nada más. Impulsa trabajos, que luego son retirados por trabajadores laborales. Entonces, si su aplicación tiene una pequeña necesidad de pasar mensajes, querrá evitar Beanstalkd.
- No hay estructuras de datos avanzadas como conjuntos, colas de prioridad, etc.
- Beanstalkd es lo que se denomina cola de primero en entrar, primero en salir (FIFO). No hay forma de organizar los trabajos por prioridad.
- No hay opciones para la agrupación en clústeres.
Dicho todo esto, Beanstalkd lo convierte en un sistema de cola rápido y elegante para proyectos simples que viven en un solo servidor. Para muchos, es más rápido y estable que Redis. Así que si estás teniendo cuestiones con Redis que parece que no puede resolver pase lo que pase, y sus necesidades son simples, vale la pena probar Beanstalkd.
Conclusión
Si ha leído hasta aquí (o ha llegado aquí con una lectura rápida,), es muy probable que esté interesado en sistemas de cola o necesite uno. Si es así, la lista en esta página le será de gran utilidad, a menos que esté buscando un sistema de cola específico para el lenguaje / marco.
Ojalá pudiera decirte que hacer cola es simple y 100% confiable, pero no lo es. Es complicado, y como todo está en segundo plano y sucede muy rápido (los errores pueden pasar desapercibidos y ser muy costosos). Aún así, las colas son muy necesarias más allá de cierto punto, y descubrirás que son un arma poderosa (quizás incluso la más poderosa) en tu arsenal. ¡Buena suerte! 🙂