2012-06-28 24 views
5

Escenario: Tenemos varios nodos distribuidos geográficamente en los que queremos tener colas que recopilan mensajes para esa ubicación. Y luego queremos enviar esta información recopilada de cada cola en cada nodo a sus colas correspondientes en una ubicación central. En el nodo central, extraeremos los datos recopilados en las colas (de otros nodos), los procesaremos y almacenaremos persistentemente.Sincronizar una instancia de cola con varias instancias de Redis

Restricciones:

  • de datos es muy importante para nosotros. Por lo tanto, tenemos que asegurarnos de que no estamos perdiendo datos en ningún caso.
  • Por lo tanto, necesitamos colas persistentes en cada nodo para que, incluso si el nodo se cuelga por algún motivo aleatorio, cuando lo sacamos tengamos los datos recopilados seguros con nosotros y podamos enviarlos al nodo central donde pueda estar procesado.
  • Del mismo modo, si el nodo central se cae, los datos deben permanecer en todos los otros nodos para que cuando aparezca el nodo central podamos enviar todos los datos al nodo central para su procesamiento.
  • Además, los datos en el nodo central no deben duplicarse o almacenarse nuevamente. Es decir, los datos recopilados en uno de los nodos deben almacenarse en los nodos centrales solo una vez.
  • Los datos que estamos recopilando son muy importantes para nosotros y el orden de entrega de datos al nodo central no es un problema.

Nuestra solución hemos considerado un par de soluciones fuera de las cuales voy a enumerar abajo de la que pensamos que sería lo mejor. Una posible solución (en nuestra opinión) es usar Redis para mantener colas en todas partes porque Redis proporciona almacenamiento persistente. Entonces, quizás tenga un daemon ejecutándose en todos los nodos geográficamente separados que lee los datos de la cola y los envía al nodo central. El nodo central al recibir los datos envía un ACK al nodo del que recibió los datos (porque los datos son muy importantes para nosotros) y luego al recibir el ACK, el nodo elimina los datos de la cola. Por supuesto, habrá un período de tiempo de espera en el que se debe recibir el ACK.

El problema La solución se ha dicho (según nosotros) no tendrán ningún problema, pero el problema es que no queremos poner en práctica todo el protocolo de sincronización por nosotros mismos por la sencilla razón de que podríamos estar equivocado. No pudimos encontrar esta forma particular de sincronización en Redis. Así que estamos abiertos a otras colas basadas en AMQP como RabbitMQ, ZeroMQ, etc. Nuevamente no pudimos averiguar si podemos hacer esto con estas soluciones.

  • ¿Estas Message Queues o cualquier otra tienda de datos proporcionan características que pueden ser la solución a nuestro problema? ¿Si es así, entonces cómo?
  • Si no es así, ¿nuestra solución es lo suficientemente buena?
  • ¿Alguien puede sugerir una solución mejor?
  • ¿Puede haber una mejor manera de hacerlo?
  • ¿Cuál sería la mejor manera de hacerlo seguro?
  • Los datos que estamos recopilando son muy importantes para nosotros y el orden de entrega de datos al nodo central no es un problema.

Respuesta

4

Puede hacer esto con RabbitMQ configurando el nodo central (o grupo de nodos) para ser un consumidor de mensajes de los otros nodos y utilizando la función de confirmación de mensaje. Esta característica significa que los nodos centrales pueden admitir la entrega, de modo que otros nodos solo eliminen los mensajes después del ack. Ver por ejemplo: http://www.rabbitmq.com/tutorials/tutorial-two-python.html

Si tiene más preguntas, envíe un correo electrónico a la lista de correo rabbitmq-discuss.

+0

Utilice la herramienta adecuada para el trabajo correcto: RabbitMQ es definitivamente la herramienta adecuada cuando necesita acuse de recibo, persistencia y enrutamiento de mensajes (avanzado). – FGRibreau

+0

"Además, los datos en el nodo central no deben duplicarse o almacenarse de nuevo. Es decir, los datos recopilados en uno de los nodos deben almacenarse en los nodos centrales solo una vez". ¿Cómo puedo asegurar esto? Tenga en cuenta que el ACK no se entrega debido a problemas de red (en nuestro escenario). ¿Qué pasa en ese caso? La cola todavía no está al tanto del estado de la finalización del trabajo. ¿El mensaje en ese caso se bloquea? ¿O lo recoge otro trabajador? Si otro trabajador lo recoge, tendremos los mismos datos trabajados dos veces, ¿verdad? – vaidik

Cuestiones relacionadas