CodeGym /Cursos /Módulo 5. Spring /Lección 205: Herramientas para arquitectura orientada a e...

Lección 205: Herramientas para arquitectura orientada a eventos: Kafka, RabbitMQ, ActiveMQ

Módulo 5. Spring
Nivel 13 , Lección 4
Disponible

Imagínate que eres el organizador de una conferencia y tienes que transmitir un mensaje importante a todos los asistentes. Claro, podrías acercarte a cada uno personalmente (como hacen los REST API en una arquitectura síncrona), pero eso llevaría una eternidad. En vez de eso, lo razonable es usar un megáfono (!) (un broker de mensajes), para emitir tu mensaje una sola vez, y los oyentes (suscriptores) lo escucharán por su cuenta.

En el mundo de EDA ese tipo de megáfonos son los brokers de mensajes. Su tarea — entregar un evento desde el remitente (producer) a los receptores (consumers). Además, hay que asegurar:

  • Fiabilidad en la entrega de mensajes.
  • Escalabilidad y alto rendimiento.
  • Procesamiento asíncrono del mensaje.

En nuestra ayuda vienen tres tecnologías populares: Apache Kafka, RabbitMQ y ActiveMQ.


Resumen de Apache Kafka, RabbitMQ y ActiveMQ

Apache Kafka

Ya sabes que Kafka es el motor cohete del mundo de los brokers de mensajes. Es una sistema distribuido, originalmente desarrollado en LinkedIn, y ahora mantenido por Apache Software Foundation. Kafka fue creado para procesar enormes volúmenes de datos en tiempo real con un alto throughput.

  • Principales ventajas de Kafka:
    • Alto rendimiento: millones de mensajes por segundo.
    • Entrega garantizada de mensajes mediante logs.
    • Soporte para escalado horizontal.
    • Buena integración con el ecosistema Big Data (Spark, Flink, etc.).
  • Cuándo usar Kafka:
    • Procesamiento en streaming de datos (por ejemplo, logging o tracking de eventos).
    • Analítica en tiempo real.
    • Construcción de microservicios donde se requiere alto rendimiento.
  • Desventajas:
    • Configuración y administración relativamente complejas.
    • Requiere buenos conocimientos de arquitectura de sistemas distribuidos.

RabbitMQ

RabbitMQ es el conejo clásico en el mundo de los brokers de mensajes. Es uno de los brokers más veteranos y usa el protocolo AMQP (Advanced Message Queuing Protocol). Soporta una funcionalidad más amplia para la interacción entre aplicaciones.

  • Principales ventajas de RabbitMQ:
    • Soporte para múltiples protocolos (AMQP, MQTT, HTTP, STOMP, etc.).
    • Diversos patrones de enrutamiento de mensajes (colas, difusión/broadcast).
    • Flexibilidad en la configuración y fácil integración.
  • Cuándo usar RabbitMQ:
    • Si necesitas flexibilidad en el enrutamiento de mensajes.
    • Para integrar sistemas heterogéneos usando distintos protocolos.
    • Cuando el sistema tiene volumen pequeño y carga media.
  • Desventajas:
    • Rendimiento no tan alto en comparación con Kafka.
    • Limitaciones en escalabilidad.

ActiveMQ

ActiveMQ es el veterano del mercado de brokers de mensajes, desarrollado por Apache Foundation. A diferencia de Kafka, que se centra en flujos de datos, ActiveMQ encaja mejor en escenarios clásicos de intercambio de mensajes en aplicaciones de negocio.

  • Principales ventajas de ActiveMQ:
    • Sencillo de usar y configurar.
    • Soporte de transacciones y entrega garantizada de mensajes.
    • Encaja bien en sistemas pequeños.
  • Cuándo usar ActiveMQ:
    • En sistemas monolíticos o microservicios pequeños.
    • Cuando se requiere soporte de transacciones y persistencia de colas.
  • Desventajas:
    • El rendimiento queda muy por detrás de Kafka.
    • Menos funcionalidades que RabbitMQ.

Comparación Kafka, RabbitMQ y ActiveMQ

Característica Apache Kafka RabbitMQ ActiveMQ
Protocolo Protocolo propio AMQP JMS
Rendimiento Muy alto Medio Bajo
Escalabilidad Horizontal Vertical Limitada
Soporte de transacciones No (soporta "Exactly once")
Uso Procesamiento de flujos de datos Integración de sistemas Intercambio de mensajes de negocio
Curva de aprendizaje Empinada Moderada Baja

¿Cómo elegir la herramienta para EDA?

Para no equivocarte con la elección, hazte dos preguntas importantes:

  1. ¿Cuáles son los requisitos de rendimiento?
  2. ¿Qué tan complejas son las rutas de mensajes que necesitas?

Para procesamiento en streaming o análisis de logs en tiempo real tu elección es Kafka.

Si necesitas una herramienta flexible con varios patrones de interacción, mejor elige RabbitMQ.

Y si tienes un sistema sencillo con colas pequeñas, ActiveMQ será una buena opción.


Ejemplos de uso de las herramientas

Ejemplo 1: Apache Kafka

En una tienda online se rastrean las acciones de los compradores: añadir productos al carrito, ver las fichas de producto. Estas acciones se escriben en un topic de Kafka, y luego sistemas analíticos procesan los streams para crear recomendaciones.


// Ejemplo de creación de producer de Kafka
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer7<String, String> producer = new KafkaProducer7<>(props);
producer.send(new ProducerRecord7<>("shopping-cart", "user123", "add_to_cart: product456"));
producer.close();

Ejemplo 2: RabbitMQ

En un sistema CRM, los pedidos de clientes entran en una cola de RabbitMQ. El servicio de procesamiento de pedidos (consumer) toma los mensajes de la cola para su posterior procesamiento.


ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
     Channel channel = connection.createChannel()) {
    channel.queueDeclare("orders_queue", false, false, false, null);
    String message = "New Order: 12345";
    channel.basicPublish("", "orders_queue", null, message.getBytes());
    System.out.println(" [x] Sent '" + message + "'");
}

Ejemplo 3: ActiveMQ

En un sistema bancario se intercambian transacciones usando ActiveMQ. Cada mensaje contiene información sobre la transacción, que luego se guarda en la base de datos.


ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
try (Connection connection = connectionFactory.createConnection()) {
    connection.start();
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    Queue queue = session.createQueue("transaction_queue");
    MessageProducer producer = session.createProducer(queue);
    TextMessage message = session.createTextMessage("Transaction: 100$ to Account 12345");
    producer.send(message);
    System.out.println("Sent: " + message.getText());
}

Peligros ocultos al trabajar con brokers de mensajes

Al trabajar con cualquier broker te puedes encontrar con problemas típicos. Por ejemplo, al usar Kafka hay que prestar atención a la configuración correcta de las particiones, para evitar sobrecargar brokers individuales. RabbitMQ, por su parte, puede requerir un análisis profundo del enrutamiento de mensajes para escenarios complejos. Y ActiveMQ puede convertirse en un cuello de botella con cargas altas.


Conclusión: ¿qué elegir?

Tu elección de broker depende de la tarea concreta y de las características de tu sistema. Kafka es tu opción para sistemas grandes y cargados de procesamiento en streaming. RabbitMQ encaja mejor para enrutamiento flexible e integración, y ActiveMQ cubrirá las necesidades de sistemas pequeños con requisitos mínimos.

No olvides que es mejor probar varias opciones antes de decidirte por una. Y sí, acuérdate de limpiar regularmente las colas de mensajes; si no, estas "fiestas de la vida" acabarán antes de lo que crees.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION