Artículos relacionados
Middleware: Instalación de RabbitMQ-Server
RabbitMQ es una solución de mensajería middleware ampliamente utilizada para la comunicación entre aplicaciones y servicios. En esta entrada de blog, exploraremos los conceptos básicos de RabbitMQ, cómo instalarlo, y profundizaremos en casos de uso comunes, la configuración de un clúster en un entorno de alta disponibilidad y la solución de problemas comunes.
¿Qué es RabbitMQ?
RabbitMQ es un software de intermediación de mensajes (message broker) que facilita la comunicación asíncrona entre aplicaciones. Implementa el protocolo Advanced Message Queuing Protocol (AMQP), proporcionando una comunicación eficiente y desacoplada entre los productores y consumidores de mensajes.
Características clave de RabbitMQ:
- Soporte para múltiples protocolos de mensajería (AMQP, MQTT, STOMP).
- Distribución de mensajes basada en colas.
- Alta disponibilidad y replicación de mensajes.
- Escalabilidad horizontal y vertical.
- Amplia comunidad y soporte.
Instalación de RabbitMQ-Server
Nos ponemos manos a la obra…
Requerimientos de Hardware para RabbitMQ
RabbitMQ es una plataforma de mensajería ligera que puede ser desplegada en una amplia gama de entornos, desde servidores dedicados hasta máquinas virtuales y contenedores. Sin embargo, para asegurar un rendimiento óptimo y una alta disponibilidad, es importante asignar los recursos adecuados de CPU, RAM y almacenamiento.
Requerimientos Mínimos
Estos requerimientos mínimos son para una instalación básica de RabbitMQ, adecuada para entornos de desarrollo o aplicaciones pequeñas.
- CPU: 1 vCPU
- RAM: 1 GB
- Almacenamiento: 5 GB
Requerimientos Recomendados
Para un entorno de producción con una carga de trabajo moderada, se recomiendan los siguientes recursos:
- CPU: 2 vCPU
- RAM: 4 GB
- Almacenamiento: 20 GB
Requerimientos para Altas Cargas de Trabajo
Para aplicaciones de gran escala o en entornos de alta disponibilidad, se deben considerar los siguientes requerimientos:
- CPU: 4+ vCPU
- RAM: 8+ GB
- Almacenamiento: 50+ GB
Requisitos previos RabbitMQ
Antes de instalar RabbitMQ, asegúrate de tener un sistema operativo actualizado. Este tutorial cubrirá la instalación en Ubuntu 20.04.
- Actualizar el sistema:
1 |
sudo apt update && sudo apt upgrade -y |
- Instalar las dependencias necesarias:
- RabbitMQ requiere Erlang, así que primero instala Erlang:
1 |
sudo apt install -y curl gnupg apt-transport-https |
- Agregar el repositorio de Erlang Solutions:
1 2 |
curl -fsSL https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | sudo apt-key add - echo "deb https://packages.erlang-solutions.com/ubuntu $(lsb_release -cs) contrib" | sudo tee /etc/apt/sources.list.d/erlang-solutions.list |
- Instalar Erlang:
1 2 |
sudo apt update sudo apt install -y erlang |
- Agregar el repositorio de RabbitMQ:
1 |
echo "deb https://dl.bintray.com/rabbitmq/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list |
- Instalar RabbitMQ-Server:
1 2 |
sudo apt update sudo apt install -y rabbitmq-server |
Configuración y puesta en marcha RabbitMQ
- Iniciar el servicio RabbitMQ:
1 2 |
sudo systemctl start rabbitmq-server sudo systemctl enable rabbitmq-server |
- Verificar el estado del servicio:
1 |
sudo systemctl status rabbitmq-server |
- Habilitar el plugin de gestión: RabbitMQ incluye un panel de administración web que debe activarse manualmente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
sudo rabbitmq-plugins enable rabbitmq_management root@RABBITMQ:~# rabbitmq-plugins enable rabbitmq_management Enabling plugins on node rabbit@RABBITMQ: rabbitmq_management The following plugins have been configured: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch Applying plugin configuration to rabbit@RABBITMQ... The following plugins have been enabled: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch started 3 plugins. |
- Acceder al panel de administración: Por defecto, se puede acceder al panel de administración en
http://IP-SERVIDOR:15672
. El usuario y la contraseña predeterminados son guest/guest.
Casos de Uso Comunes RabbitMQ
RabbitMQ se utiliza en una variedad de escenarios donde la mensajería asíncrona y desacoplada es crucial. Algunos casos de uso comunes incluyen:
- Microservicios: RabbitMQ facilita la comunicación entre microservicios, permitiendo que los servicios se comuniquen de manera asíncrona y gestionen cargas de trabajo de forma independiente.
- Colas de Tareas: En aplicaciones web y móviles, RabbitMQ se utiliza para gestionar y procesar tareas en segundo plano, como el procesamiento de imágenes, envío de correos electrónicos y análisis de datos.
- Balanceo de Carga: RabbitMQ distribuye las solicitudes de trabajo entre varios trabajadores, lo que ayuda a balancear la carga y mejorar el rendimiento general del sistema.
- Eventos y Notificaciones: RabbitMQ se utiliza para enviar eventos y notificaciones en tiempo real, permitiendo a las aplicaciones reaccionar a cambios en el sistema de manera eficiente.
Configuración de un Cluster en un Entorno de Alta Disponibilidad RabbitMQ
Para asegurar la alta disponibilidad y la redundancia, se puede configurar RabbitMQ en un clúster. A continuación se detallan los pasos para configurar un clúster de RabbitMQ.
Preparación de los Nodos
- Instalar RabbitMQ en todos los nodos del clúster: Sigue los pasos de instalación descritos anteriormente en todos los servidores que formarán parte del clúster.
- Configurar la comunicación entre los nodos: Asegúrate de que todos los nodos puedan comunicarse entre sí. Esto puede implicar la configuración de las reglas de firewall y la resolución de nombres DNS.
Configuración del Cluster
- Copiar el archivo .erlang.cookie entre los nodos: RabbitMQ utiliza un archivo de cookie para autenticar los nodos del clúster. Copia el archivo “.erlang.cookie” del nodo principal a los demás nodos.
1 2 |
scp /var/lib/rabbitmq/.erlang.cookie user@node2:/var/lib/rabbitmq/.erlang.cookie scp /var/lib/rabbitmq/.erlang.cookie user@node3:/var/lib/rabbitmq/.erlang.cookie |
- Unir los nodos al clúster: En cada nodo secundario, ejecuta los siguientes comandos para detener RabbitMQ, unir el nodo al clúster y reiniciar RabbitMQ.
1 2 3 4 |
sudo systemctl stop rabbitmq-server sudo rabbitmqctl reset sudo rabbitmqctl join_cluster rabbit@<node1-hostname> sudo systemctl start rabbitmq-server |
- Verificar el estado del clúster: En cualquier nodo, puedes verificar el estado del clúster con el siguiente comando:
1 |
sudo rabbitmqctl cluster_status |
Alta Disponibilidad y Mirroring de Colas en RabbitMQ
Para asegurar que las colas sean altamente disponibles, configura la política de mirroring de colas.
- Configurar la política de mirroring:
1 |
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' |
Solución de Problemas Comunes en RabbitMQ
Problema 1: No se puede iniciar el servicio RabbitMQ
Solución:
- Verifica los logs de RabbitMQ para identificar el problema:
1 |
sudo tail -f /var/log/rabbitmq/rabbitmq.log |
- Asegúrate de que Erlang está correctamente instalado y configurado.
Problema 2: Las colas no se están replicando en el clúster
Solución:
- Verifica la política de mirroring:
1 |
sudo rabbitmqctl list_policies |
- Asegúrate de que todos los nodos están correctamente configurados y unidos al clúster.
Problema 3: Problemas de conectividad entre nodos
Solución:
- Verifica las reglas de firewall para asegurar que los nodos pueden comunicarse entre sí en los puertos necesarios.
- Asegúrate de que los nombres de host y DNS están correctamente configurados.
Ejemplo de Integración RabbitMQ y Nginx
Ahora vamos a detallar cómo integrar RabbitMQ con Nginx para gestionar las solicitudes de mensajes de manera eficiente. Este ejemplo cubrirá la instalación y configuración de RabbitMQ y Nginx, y cómo pueden trabajar juntos para manejar las solicitudes de mensajería.
Requisitos previos
- Servidor Ubuntu 20.04 o superior.
- Acceso root o permisos de sudo.
Instalación de RabbitMQ
Repetimos pasos que ya estaban anteriormente…
1. Instalar las Dependencias
1 2 |
sudo apt update && sudo apt upgrade -y sudo apt install -y curl gnupg apt-transport-https |
2. Instalar Erlang
1 2 3 4 |
curl -fsSL https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | sudo apt-key add - echo "deb https://packages.erlang-solutions.com/ubuntu $(lsb_release -cs) contrib" | sudo tee /etc/apt/sources.list.d/erlang-solutions.list sudo apt update sudo apt install -y erlang |
1 2 3 |
echo "deb https://dl.bintray.com/rabbitmq/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list sudo apt update sudo apt install -y rabbitmq-server |
4. Configurar RabbitMQ
1 2 3 |
sudo systemctl start rabbitmq-server sudo systemctl enable rabbitmq-server sudo rabbitmq-plugins enable rabbitmq_management |
Accede al panel de administración en http://localhost:15672
con el usuario y contraseña guest/guest
.
Instalación de Nginx
1. Instalar Nginx
1 |
sudo apt install -y nginx |
Vamos a configurar Nginx como un proxy inverso para que pueda dirigir las solicitudes HTTP a RabbitMQ.
1 |
sudo nano /etc/nginx/sites-available/rabbitmq_proxy |
Agrega la siguiente configuración:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
server { listen 80; server_name your_domain_or_IP; location / { proxy_pass http://localhost:15672; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } |
3. Habilitar la Configuración de Nginx
1 2 3 |
sudo ln -s /etc/nginx/sites-available/rabbitmq_proxy /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx |
Ejemplo Práctico: Enviar y Recibir Mensajes en RabbitMQ
Para demostrar cómo RabbitMQ y Nginx pueden trabajar juntos, vamos a crear un ejemplo simple en Python.
1. Instalar Librerías Necesarias
1 2 |
sudo apt install -y python3 python3-pip pip3 install pika requests |
2. Crear Productor de Mensajes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# producer.py import pika import requests # Conectar a RabbitMQ connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # Declarar la cola channel.queue_declare(queue='hello') # Enviar mensaje channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') print(" [x] Sent 'Hello World!'") # Cerrar conexión connection.close() |
3. Crear Consumidor de Mensajes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# consumer.py import pika # Conectar a RabbitMQ connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # Declarar la cola channel.queue_declare(queue='hello') def callback(ch, method, properties, body): print(f" [x] Received {body}") # Escuchar la cola channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming() |
4. Ejecutar los Scripts
En una terminal, ejecuta el productor:
1 |
python3 producer.py |
En otra terminal, ejecuta el consumidor:
1 |
python3 consumer.py |
Verás que el consumidor recibe el mensaje enviado por el productor.
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?