RabbitMQ permite gestionar colas de mensajes entre emisores y destinatarios, en el siguiente post vamos a utilizar en python Pika para su implementación.
RabbitMQ es un sistema intermediario diseñado para facilitar la transferencia de mensajes entre productores y consumidores a través de la implementación de colas.
Este componente, esencial en la arquitectura de sistemas distribuidos, se basa en conceptos clave:
Esta introducción busca proporcionar una visión clara y concisa de los elementos fundamentales de RabbitMQ, allanando el camino para una comprensión más profunda de su funcionamiento en entornos de mensajería.
La implementación en Python con la librería Pika implica la creación de dos programas esenciales: el productor y el consumidor.
Pika
proporciona una interfaz eficaz para la comunicación con RabbitMQ, aprovechando un conjunto de objetos cuidadosamente diseñados para este propósito.
En nuestro ejemplo práctico, imaginemos el productor como una aplicación diseñada para gestionar pedidos de entrega de alimentos 🛵. Esta aplicación, cuyo objetivo es optimizar el proceso de entrega, se encarga de enviar múltiples mensajes📝 relacionados con los pedidos realizados por los usuarios 📱.
Para lograr esta implementación, abordaremos los siguientes pasos:
Pasos | Descripción |
---|---|
Productor: | Desarrollar un programa que, como un eficiente tomador de pedidos, genere y envíe mensajes📝 a la cola de RabbitMQ. Estos mensajes contendrán información valiosa sobre los pedidos de comida. |
Consumidor: | Crear un programa que actúe como el receptor de estos mensajes en la cola. El consumidor estará encargado de procesar estos mensajes según las necesidades del sistema, realizando las acciones pertinentes, como gestionar la entrega de los pedidos. |
Este enfoque estructurado y eficiente garantiza una implementación clara y funcional, proporcionando una base sólida para sistemas que gestionan flujos de información en entornos dinámicos.
!pip install pika
send.py
📄import pika
from datetime import datetime
= pika.BlockingConnection(
connection ='localhost'))
pika.ConnectionParameters(host= connection.channel()
channel
='delivery')
channel.queue_declare(queue
=['🍕🍕🍕','🍔🍔🍔','🍰🍰🍰','🍺🍺🍺']
pedidos
for i in pedidos:
='', routing_key='delivery', body=i)
channel.basic_publish(exchangeprint(" [x] Se envia pedido!'"+ i)
connection.close()
receive.py
📄import pika, sys, os
from datetime import datetime
def main(queue='delivery'):
= pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
connection = connection.channel()
channel =queue)
channel.queue_declare(queue
def callback(ch, method, properties, body):
print(" [x] Received %r" % body.decode())
='delivery', on_message_callback=callback, auto_ack=True)
channel.basic_consume(queue
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
if __name__ == '__main__':
try:
=queue)
main(queueexcept KeyboardInterrupt:
print('Interrupted')
try:
0)
sys.exit(except SystemExit:
0) os._exit(
A continuación vamos a modificar el script para que pueda conectarse a un mongodb atlas y realice el insert de los mensajes recibidos.
import pymongo
import pika, sys, os
from datetime import datetime
# Crear una conexion con MongoClient
= pymongo.MongoClient("mongodb+srv://NombreUser:PasswordUser@clusterName.moczg.mongodb.net/rabbit?retryWrites=true&w=majority")
client
# Database
= client["rabbit"]
db
# Collection
= db["mensajes"]
collection
def main(queue='delivery'):
= pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
connection = connection.channel()
channel =queue)
channel.queue_declare(queue
def callback(ch, method, properties, body):
print(" [x] Received %r" % body.decode())
={'fecha':datetime.now(),'queue':queue,'message':body.decode()}
body_indsert"mensajes"].insert_one(body_indsert)
db[
='hello', on_message_callback=callback, auto_ack=True)
channel.basic_consume(queue
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
if __name__ == '__main__':
try:
=queue)
main(queueexcept KeyboardInterrupt:
print('Interrupted')
try:
0)
sys.exit(except SystemExit:
0) os._exit(
Para descargar el código de estos dos archivos puedes hacerlo desde el siguiente link
Para conocer más de Rabbitmq puedes ver los siguientes sitios:
📄 Documentación Oficial con el Tutorial
🐍 Pika
Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".
For attribution, please cite this work as
Mendez (2021, Sept. 10). Romina Mendez: RabbitMQ-Pika. Retrieved from https://r0mymendez.github.io/posts/2021-09-10-rabbitmq-pika/
BibTeX citation
@misc{mendez2021rabbitmq-pika, author = {Mendez, Romina}, title = {Romina Mendez: RabbitMQ-Pika}, url = {https://r0mymendez.github.io/posts/2021-09-10-rabbitmq-pika/}, year = {2021} }