Comandos de bolsillo para gestionar rabbitmq
La entrada de hoy es una pura nota mental, de estas cosas que son muy útiles tener apuntadas en algún lado, pero que no se suelen usar con frecuencia una vez la configuración inicial está funcionando bien. Para ello, voy a tratar de describir, de la manera mas breve y concisa prosible, los principales componentes de RabbitMQ y cómo crearlos.
Introducción
RabbitMQ es un broker de mensajería multiprotocolo. En otras palabras, es un software que permite enviar y recibir mensajes dentro de un sistema. En este caso, la flexibilidad de rabbitmq soporta el ser implementado con facilidad tanto desde un sistema standalone como en un contenedor.
Se suele utilizar con frecuencia en infraestructuras de tipo docker y kubernetes, ya que es una alternativa sencilla para permitir la comunicación utilizando mensajes, las colas y los exchanges.
Los principales protocolos soportados son:
- AMPQ: Es el protocolo nativo y el más utilizado. Es el que mayor cantidad de plugins tiene desarrollados y resulta fácil de implementar.
- STOPM: Es un protocolo binario, diseñado principalmente para mensajes ligeros de publicación / suscripción.
- HTTP and WebSockets: No es realmente un protocolo, pero es posible trabajar con él utilizando plugins específicos.
Para más info, aquí la documentación oficial.
Herramienta de comandos de línea
La herramienta de comandos que permite la gestión del nodo servidor de rabbitmq es rabbitmqctl. Lleva a cabo todas las acciones mediante la conexión al puerto del nodo RabbitMQ indicado. Para su autenticación, utiliza una contraseña secreta compartida, también conocida como archivo cookie.
Comandos para la gestión de usuarios
Por defecto, cuando desplegamos rabbitmq, crea el usuario guest / guest. Este usuario viene con una restricción de seguridad, la cual impide que sea utilizado fuera del ámbito «localhost».
Por ello y por seguridad, siempre es recomendable crear uno o varios usuarios, en función de las necesidades y de la exposición del servicio. Especificar que los roles aquí detallados, se utilizarán con el plugin de consola de gestión, accesible por defecto mediante interfaz web en el puerto 15672.
En la siguiente lista, podemos ver los diferentes roles que pueden ser asignados:
- Ninguno (None): El usuario tendrá acceso vía protocolos, pero no a la interfaz gráfica de gestión.
- management: Un usuario de lectura. Podrá ver colas, exchanges, virtual host, canales, estadísticas globales… siempre que él sea el propietario.
- policymaker: Podrá hacer todo lo que puede hacer management, además de ver, crear y borrar políticas y parámetros de los virtual host a los cuales pueda hacer login vía AMQP.
- monitoring: Podrá listar y leer virtual host, conexiones, canales, estadísticas, uso de memoria, clustering del nodo… aunque no sea el propietario.
- administrator: Permisos máximos. Puede gestionarlo todo.
Con toda esta info, la sintaxis para crear un usuario sería:
rabbitmqctl add_user [nombre_usuario] [contraseña]
Dónde:
- [nombre_usuario] es el nombre que queremos dar al nuevo usuario.
- [contraseña] es la contraseña en plano que queremos asignarle al mismo.
Y para añadirlo a un determinado rol:
rabbitmqctl set_user_tags [nombre_usuario] [rol]
Dónde:
- [rol] es una de las opciones descritas anteriormente
Para darle permisos totales sobre un determinado virtual host:
rabbitmqctl set_permissions -p [nombre_vhost] [nombre_usuario] [configure] [write] [read]
Dónde:
- [nombre_vhost]: Es el nombre del virtual host sobre el cual queremos darle privilegios.
- [configure]: Equivale a los permisos «Configure regexp».
- [write]: Equivale a los permisos «Write regexp».
- [read]: Equivale a los permisos «Read regexp».
La forma común de configurarla, es asignarles el valor «.*». Un ejemplo:
rabbitmqctl set permissions -p vhost usuario ".*" ".*" ".*"
Para asignar permisos sobre el topic de un virtual host, al sintaxis es parecida al anterior:
rabbitmqctl set_topic_permissions -p [nombre_vhost] [nombre_usuario] [nombre_exchange] [write] [read]
Dónde:
- [nombre_exchange]: Es el objeto sobre el que se le da permisos. Es habitual darle permisos sobre (AMQP default).
Virtual Host
Los virtual host son grupos lógicos, que sirven para segmentar la información, de manera similar a como se haría en un apache. Para crearlos:
rabbitmqctl add_vhost [nombre_vhost]
Dónde:
[nombre_vhost]: Es el nombre que queremos darle a este grupo.
También es posible establecer el límite máximo de conexiones:
rabbitmqctl set_vhost_limits -p [nombre_vhost] '{"max-connections": [value]}'
Dónde:
[value]: Será un número entero entre 0 y 256.
Exchanges
Los mensajes de RabbitMQ no se envían directamente a una cola. En su lugar, se envían a un exchange. El exchange es el responsable de enrutar los mensajes a diferentes colas con la ayuda de enlaces y claves de enrutamiento.
Hay 4 tipos de exchanges diferentes:
- direct: Enruta los mensajes con una clave de enrutamiento igual a la clave de enrutamiento declarada por la cola de enlace.
- fanout: Enruta los mensajes a todas las colas vinculadas indiscriminadamente. Si se le proporciona una clave de enrutamiento, simplemente se ignorará.
- topic: Enruta los mensajes a las colas cuya clave de enrutamiento coincide con todos o una parte de una clave de enrutamiento.
- headers: Enruta los mensajes en función de una coincidencia de encabezados de mensaje con los encabezados esperados especificados por la cola de enlace.
Si os pica la curiosidad, he aquí un post en inglés bastante completo e ilustrativo. Pero vayamos al grano. Para listar todos los exchanges:
rabbitmqadmin -V test list exchanges
Y para crear uno:
rabbitmqadmin declare exchange name=[nombre_exchange] type=[tipo]
Dónde:
- [nombre_exchange]: Es el nombre con el que vamos a identificar a este objeto.
- [tipo]: Es uno de los valores descritos anteriormente.
Colas
En RabbitMQ, las colas son el objeto productor y consumidor de mensajes. Tienen multiples usos, como distribuir mensajes, balanceo de cargas, etc. Aunque su función principal es almacenar los mensajes para su posterior distribución.
Para listar las colas con toda la información disponible:
rabbitmqadmin -f long -d 3 list queues
Ejemplo para envíar un mensaje a una cola:
rabbitmqadmin publish exchange=amq.default routing_key=test payload="hola, mundo"
Ejemplo para recuperar el mensaje de una cola:
rabbitmqadmin get queue=test ackmode=ack_requeue_false
Conclusión
RabbitMQ es una herramienta altamente funcional y configurable. Una de las mayores ventajas es que va a simplificar nuestra manera de comunicarnos dentro de una infraestructura.
He querido llamar a esta entrada «de bolsillo», puesto que considero que apenas he rascado la superficie del producto, y que los comandos aquí descritos son básicos mínimos para poder empezar a trabajar. Para más info, RabbitMQ tiene una documentación extensa, detallada y con muchos ejemplos, que podréis encontrar aquí.
Problema resuelto!