Los 6 mejores sistemas de colas para desarrolladores backend

¿Está buscando un sistema de colas? ¿O tal vez estás buscando uno mejor? ¡Aquí tienes toda la información que necesitas!

Los sistemas de colas son el secreto mejor guardado del desarrollo back-end.

Sin tratar de escribir un poema en elogio de los sistemas de colas, diría que un desarrollador backend junior se convierte en un desarrollador 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 generales (o incluso imposibles de instalar si se encuentra en un entorno típico de alojamiento compartido), pero todas las aplicaciones no triviales se beneficiarán de las colas. sistemas y aplicaciones grandes son imposibles sin hacer cola.

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 próximas secciones introductorias lo inducirán a dormir mucho. 🙂 Así que siéntete libre de seguir adelante. Las secciones introductorias están pensadas para aquellos que solo tienen una vaga idea de los sistemas de colas o simplemente escucharon 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 vas a un mostrador de boletos, por ejemplo, notarás que tendrás que pararte al final de la cola, mientras que la persona al principio de la cola obtendrá el boleto primero. Esto es lo que también llamamos el fenómeno del “primero en llegar, primero en ser atendido”. En informática, es posible escribir programas que almacenen sus tareas de esta manera en una cola, procesándolas una por una en el mismo orden de llegada.

Tenga en cuenta que la cola no realiza ningún procesamiento real. Es solo una especie de almacenamiento temporal donde las tareas esperan hasta que algo las recoge. Si todo esto suena demasiado abstracto, no se preocupe. Es 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 larga, diría que la principal necesidad de los sistemas de colas 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

Suponga que está ejecutando una campaña de marketing de comercio electrónico donde 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 agradecimiento. 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 en paralelo

Muchos desarrolladores, especialmente aquellos que en su mayoría codifican aplicaciones más simples y de bajo tráfico, tienen la costumbre de usar trabajos cron para el procesamiento en segundo plano. Esto está bien hasta que el tamaño de la entrada crece tanto que no se puede 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 del fracaso

Por lo general, no pensamos en el fracaso como desarrolladores web. 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 muy 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 la 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 se interrumpe 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 e 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 en la actualidad.

redis

redis se conoce como un almacén de clave-valor 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.
  • Altamente eficiente: puede admitir fácilmente más de 100 000 operaciones de lectura/escritura por segundo.
  • Esquema de persistencia altamente flexible. Puede buscar el máximo rendimiento 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 consistencia.
  • Clústeres compatibles desde el primer momento

Tenga en cuenta que Redis no tiene abstracciones de mensajería/puesta en cola/recuperación, por lo que debe usar un paquete o crear un sistema liviano usted mismo. Un ejemplo es que Redis es el backend de cola predeterminado para el marco PHP de Laravel, donde los autores del marco implementaron un programador.

Aprendiendo Redis es fácil.

ConejoMQ

Hay algunas diferencias sutiles entre Redis y ConejoMQasí que sacémoslos del camino primero.

En primer lugar, RabbitMQ tiene una función más especializada y bien definida, 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 «enviadores» 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).
  • Compatibilidad con clústeres y federaciones 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.
  • Despliegue con la herramienta de su elección (Docker, Chef, Puppet, etc.).

¿Cuándo usar RabbitMQ? Yo diría que es una excelente opción cuando sabe que necesita usar el paso de mensajes asíncrono 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 echarle un vistazo.

Aquí es donde sobresale ActiveMQ:

  • Está implementado en Java y, por lo tanto, tiene una integración Java realmente ordenada (sigue el estándar JMS).
  • Múltiples protocolos compatibles: AMQP, MQTT, STOMP, OpenWire, etc.
  • Maneja la seguridad, el enrutamiento, la caducidad de los mensajes, el análisis, etc., de forma inmediata.
  • Compatibilidad integrada con patrones populares de mensajería distribuida, lo que le permite ahorrar 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 admitidos 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 desea 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 hace ActiveMQ, no hay ninguna diferencia en las características, ya que utiliza ActiveMQ debajo de la superficie.

La ventaja es que es un servicio gestionado, por lo que no tienes que preocuparte de nada más que de 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 quieto cuando se trata de piezas de infraestructura crítica, ¿verdad? 🙂

Y así tenemos Amazon SQS, que es un servicio de cola simple totalmente 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 paso de mensajes. Al igual que Redis, es un backend simple para aceptar y distribuir trabajos en colas.

Entonces, ¿cuándo querría usar Amazon SQS? Aquí hay algunas razones:

  • Eres un fanático de AWS y no tocarás nada más (honestamente, hay muchas personas 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 que no se pierda ninguno de los trabajos.
  • No desea crear un clúster y tener que supervisarlo usted mismo. O peor aún, tiene que construir herramientas de monitoreo cuando podría estar usando ese tiempo para hacer un desarrollo productivo.
  • Ya tiene inversiones sustanciales en la plataforma de AWS y permanecer encerrado tiene sentido desde el punto de vista empresarial.
  • Desea un sistema de cola simple y enfocado sin ninguna de las pelusas asociadas con el paso de mensajes, protocolos y demás.

En general, Amazon SQS es una opción sólida para cualquier persona que desee incorporar colas de trabajo en su sistema y no tener que preocuparse por instalar/supervisar cosas por sí mismos.

habichuelas mágicas

habichuelas mágicas ha existido durante mucho tiempo y es un backend rápido, fácil y probado en batalla para la cola de trabajos. Hay algunas características de Beanstalkd que lo diferencian considerablemente de Redis:

  • Es estrictamente un sistema de colas de trabajo y nada más. Le empujas a los trabajos, que luego son retirados por los trabajadores. Entonces, si su aplicación tiene incluso 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 ordenar los trabajos por prioridad.
  • No hay opciones para la agrupación.

Dicho todo esto, Beanstalkd lo convierte en un sistema de cola ágil y rápido para proyectos simples que viven en un solo servidor. Para muchos, es más rápido y más estable que Redis. Así que si estás teniendo problemas con Redis que parece que no puede resolver sin importar qué, y sus necesidades son simples, vale la pena probar Beanstalkd.

Conclusión

Si has leído hasta aquí (o has llegado aquí leyendo por encima 😉), hay muchas posibilidades de que estés interesado en los sistemas de colas o necesites uno. Si es así, la lista en esta página le servirá bien, a menos que esté buscando un sistema de cola específico de idioma/marco.

Desearía poder decirle que hacer cola es simple y 100 % confiable, pero no lo es. Es complicado, y dado que todo está en segundo plano y sucede muy rápido (los errores pueden pasar desapercibidos y volverse muy costosos). Aún así, las colas son muy necesarias más allá de un punto, y encontrarás que son un arma poderosa (quizás incluso la más poderosa) en tu arsenal. ¡Buena suerte! 🙂