2012-06-28 11 views
5

Lo scenario: Abbiamo più nodi distribuiti geograficamente su cui vogliamo disporre di code che raccolgono messaggi per quella posizione. E poi vogliamo inviare questi dati raccolti da ogni coda in ogni nodo alle loro code corrispondenti in una posizione centrale. Nel nodo centrale, estrarremo i dati raccolti nelle code (da altri nodi), elaborarli e memorizzarli in modo persistente.Sincronizzazione di un'istanza di coda con più istanze di Redis

Vincoli:

  • dati è molto importante per noi. Pertanto, dobbiamo assicurarci che non stiamo perdendo i dati in ogni caso.
  • Pertanto, abbiamo bisogno di code persistenti su ogni nodo in modo che anche se il nodo si interrompe per qualche motivo casuale, quando lo presentiamo abbiamo i dati raccolti al sicuro con noi e possiamo inviarlo al nodo centrale dove può essere elaborato
  • Analogamente, se il nodo centrale si interrompe, i dati devono rimanere su tutti gli altri nodi in modo tale che quando viene visualizzato il nodo centrale, è possibile inviare tutti i dati al nodo centrale per l'elaborazione.
  • Inoltre, i dati sul nodo centrale non devono essere duplicati o memorizzati di nuovo. Questo significa che i dati raccolti su uno dei nodi dovrebbero essere memorizzati sui nodi centrali solo una volta.
  • I dati che stiamo raccogliendo sono molto importanti per noi e l'ordine di consegna dei dati al nodo centrale non è un problema.

nostra soluzione Abbiamo considerato un paio di soluzioni da cui sto per elencare giù quello che abbiamo pensato che sarebbe il migliore. Una possibile soluzione (a nostro avviso) è usare Redis per mantenere le code ovunque perché Redis fornisce memoria persistente. Quindi forse un demone in esecuzione su tutti i nodi geograficamente separati che legge i dati dalla coda e li invia al nodo centrale. Il nodo centrale alla ricezione dei dati invia un ACK al nodo da cui ha ricevuto i dati (poiché i dati sono molto importanti per noi) e quindi alla ricezione di ACK, il nodo elimina i dati dalla coda. Naturalmente, ci sarà un periodo di timeout in cui l'ACK deve essere ricevuto.

Il problema La soluzione sopra indicato (secondo noi) funziona bene, ma il problema è che noi non vogliamo implementare l'intero protocollo di sincronizzazione da noi stessi per il semplice motivo che potremmo essere sbagliato qui. Non siamo riusciti a trovare questo modo particolare di sincronizzazione in Redis. Quindi siamo aperti ad altre code basate su AMQP come RabbitMQ, ZeroMQ, ecc. Ancora una volta non siamo stati in grado di capire se possiamo farlo con queste soluzioni.

  • Queste code di messaggi o qualsiasi altro archivio dati forniscono funzionalità che possono essere la soluzione al nostro problema? Se sì, allora come?
  • In caso contrario, la soluzione è sufficiente?
  • Qualcuno può suggerire una soluzione migliore?
  • Può esserci un modo migliore per farlo?
  • Quale sarebbe il modo migliore per renderlo sicuro?
  • I dati che stiamo raccogliendo sono molto importanti per noi e l'ordine di consegna dei dati al nodo centrale non è un problema.

risposta

4

È possibile eseguire questa operazione con RabbitMQ impostando il nodo centrale (o il cluster di nodi) come utente di messaggi dagli altri nodi e utilizzando la funzione di riconoscimento dei messaggi. Questa caratteristica indica che i nodi centrali possono eseguire il recapito, in modo che altri nodi elimini solo i messaggi dopo l'ack. Vedi ad esempio: http://www.rabbitmq.com/tutorials/tutorial-two-python.html

Se hai ulteriori domande, invia una mail alla mailing list di rabbitmq-discuss.

+0

Utilizzare lo strumento giusto per il lavoro giusto: RabbitMQ è sicuramente lo strumento giusto quando è necessario il riconoscimento, la persistenza e il routing dei messaggi (avanzato). – FGRibreau

+0

"Inoltre, i dati sul nodo centrale non devono essere duplicati o memorizzati di nuovo: i dati raccolti su uno dei nodi dovrebbero essere memorizzati sui nodi centrali solo una volta." Come posso assicurarlo? Considera che l'ACK non viene consegnato a causa di problemi di rete (nel nostro scenario). Cosa succede in quel caso? La coda non è ancora a conoscenza dello stato del completamento del lavoro. Il messaggio in quel caso viene bloccato? Oppure un altro lavoratore lo raccoglie? Se un altro lavoratore lo preleva, allora gli stessi dati funzioneranno due volte, giusto? – vaidik

Problemi correlati