Mantén la atención porque en este tutorial vas a hallar la respuesta que buscas.Este tutorial ha sido analizado por nuestros expertos para garantizar la calidad y exactitud de nuestro post.
Solución:
Necesita una cola duradera para almacenar mensajes si no hay consumidores conectados disponibles para procesar los mensajes en el momento en que se publican.
Un intercambio no almacena mensajes, pero una cola sí. La parte confusa es que los intercambios se pueden marcar como “duraderos”, pero todo lo que realmente significa es que el intercambiarse seguirá allí si reinicia su corredor, pero no no significa que todos los mensajes enviados a ese intercambio se conservan automáticamente.
Dado eso, aquí hay dos opciones:
- Llevar a cabo un paso administrativo antes de que sus editores comiencen a crear la(s) cola(s) usted mismo. Puede usar la interfaz de usuario web o las herramientas de línea de comandos para hacer esto. Asegúrese de crearlo como una cola duradera para que almacene todos los mensajes que se le enruten incluso si no hay consumidores activos.
- Suponiendo que sus consumidores estén codificados para declarar siempre (y, por lo tanto, crear automáticamente) sus intercambios y colas al inicio (y que los declaren como duraderos), simplemente ejecute todos sus consumidores al menos una vez antes de iniciar cualquier editor. Eso asegurará que todas sus colas se creen correctamente. A continuación, puede cerrar los consumidores hasta que realmente se necesiten porque las colas almacenarán de forma persistente cualquier mensaje futuro que se les enrute.
Yo iría por el número 1. Es posible que no haya muchos pasos para realizar y siempre puede escribir los pasos necesarios para que puedan repetirse. Además, si todos sus consumidores se van a extraer de la misma cola única (en lugar de tener una cola dedicada cada uno), es realmente una parte mínima de los gastos generales administrativos.
Las colas son algo que debe administrarse y controlarse adecuadamente. De lo contrario, podría terminar con consumidores deshonestos declarando colas duraderas, usándolas durante unos minutos pero nunca más. Poco después, tendrá una cola en constante crecimiento sin nada que reduzca su tamaño y un inminente apocalipsis de corredores.
Como lo mencionó Brian, un intercambio no almacena mensajes y es principalmente responsable de enrutar mensajes a otro intercambio o cola. Si el intercambio no está vinculado a una cola, todos los mensajes enviados a ese intercambio se ‘perderán’.
No debería necesitar declarar colas de clientes fijas en la secuencia de comandos del editor, ya que esto podría no ser escalable. Sus editores pueden crear colas de forma dinámica y enrutarlas internamente mediante el enlace de intercambio a intercambio.
RabbitMQ admite enlaces de intercambio a intercambio que permitirán flexibilidad de topología, desacoplamiento y otros beneficios. Puede leer más aquí en RabbitMQ Exchange to Exchange Bindings [AMPQ]
Intercambio de RabbitMQ a enlace de intercambio
Ejemplo de código de Python para crear un enlace de intercambio a intercambio con persistencia si no hay un consumidor presente usando la cola.
#!/usr/bin/env python
import pika
import sys
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
#Declares the entry exchange to be used by all producers to send messages. Could be external producers as well
channel.exchange_declare(exchange='data_gateway',
exchange_type='fanout',
durable=True,
auto_delete=False)
#Declares the processing exchange to be used.Routes messages to various queues. For internal use only
channel.exchange_declare(exchange='data_distributor',
exchange_type='topic',
durable=True,
auto_delete=False)
#Binds the external/producer facing exchange to the internal exchange
channel.exchange_bind(destination='data_distributor',source='data_gateway')
##Create Durable Queues binded to the data_distributor exchange
channel.queue_declare(queue='trade_db',durable=True)
channel.queue_declare(queue='trade_stream_service',durable=True)
channel.queue_declare(queue='ticker_db',durable=True)
channel.queue_declare(queue='ticker_stream_service',durable=True)
channel.queue_declare(queue='orderbook_db',durable=True)
channel.queue_declare(queue='orderbook_stream_service',durable=True)
#Bind queues to exchanges and correct routing key. Allows for messages to be saved when no consumer is present
channel.queue_bind(queue='orderbook_db',exchange='data_distributor',routing_key='*.*.orderbook')
channel.queue_bind(queue='orderbook_stream_service',exchange='data_distributor',routing_key='*.*.orderbook')
channel.queue_bind(queue='ticker_db',exchange='data_distributor',routing_key='*.*.ticker')
channel.queue_bind(queue='ticker_stream_service',exchange='data_distributor',routing_key='*.*.ticker')
channel.queue_bind(queue='trade_db',exchange='data_distributor',routing_key='*.*.trade')
channel.queue_bind(queue='trade_stream_service',exchange='data_distributor',routing_key='*.*.trade')
Finalizando este artículo puedes encontrar los informes de otros desarrolladores, tú todavía puedes insertar el tuyo si lo deseas.