2015-08-17 10 views
6

Ho un'API che può essere ridimensionata orizzontalmente. L'API riconoscerà le richieste del cliente e dovrà inviare il lavoro a un sistema secondario. Il sistema secondario deve elaborare il lavoro in base al principio "primo arrivato, primo servito", una coda. Inoltre, poiché il sistema secondario accede a risorse che possono essere condivise, può essere attiva solo una sua istanza in un dato momento. Il sistema secondario deve avere un meccanismo di failover. Se la prima istanza del sistema secondario scende, un'altra istanza deve prendere il suo posto.Utente singolo attivo RabbitMQ con utenti passivi di failover

Stavo pensando di utilizzare RabbitMQ come meccanismo di accodamento e avere più utenti connessi ma solo un utente attivo che elaborerà il lavoro. Una delle altre istanze prenderà il lavoro di elaborazione dei messaggi se il consumatore precedentemente attivo non riesce a riconoscere i messaggi. Questo è possibile con RabbitMQ?

Inoltre è possibile riconoscere il messaggio solo dopo che il lavoro è stato completato?

Grazie.

+0

Siamo spiacenti di far risorgere una vecchia domanda qui, ma ho anche esattamente questa situazione e mi chiedo se hai mai trovato una soluzione a questo problema? Karl – Stono

risposta

0

in questo caso suggerisco di duplicare il messaggio sopra le code, es. se hai 3 utenti per un messaggio, è preferibile creare 3 code e lo scambiatore duplica il messaggio su questa 3queue.



Inoltre è possibile riconoscere il messaggio solo dopo che il lavoro è stato completato?
sì, è possibile spostare il riconoscimento nel codice, nel tuo caso dopo l'elaborazione del messaggio.

+0

Grazie per la risposta. Avendo 3 consumatori, tutti elaboreranno il messaggio. Mi piacerebbe avere un consumatore che esegue l'elaborazione e gli altri che eseguono l'elaborazione se il consumatore primario si arresta. – indit

+0

non capisco. solo 1 funziona e l'altro 2 si sveglia solo "1" scende? destra? –

1

Questo non è direttamente possibile con RabbitMQ, il modo in cui si desidera.

È possibile avere più utenti per una singola coda. Tuttavia, RabbitMQ invierà messaggi a tutti i consumatori disponibili per svolgere il proprio lavoro. In altre parole, se hai 3 utenti e invii 3 messaggi alla coda, ognuno di questi consumatori probabilmente riceverà 1 dei messaggi.

Se è veramente necessario il failover attivo/passivo per i consumatori, sarà necessario utilizzare un altro sistema per gestire e monitorare le istanze del consumatore.

Per quanto riguarda il riconoscimento del lavoro svolto: sì. Metti la tua coda in modalità riconoscimento selezionando no_ack a true. Ciò richiederà che tu riconosca ciascun messaggio dal consumatore. È possibile conservare il messaggio fino al termine del lavoro e quindi confermare il messaggio al termine del lavoro.

Vedere l'esempio worker queue nella documentazione RabbitMQ per un esempio di utilizzo dei riconoscimenti e per una breve discussione sull'invio dei messaggi round-robin ai consumatori.

+0

Grazie Derick. Un'alternativa che stavo pensando di impostare il prefetch_count su 1. Come ho capito, questo consegnerà il messaggio a un consumatore e attenderà fino a quando un ack verrà inviato alla consegna del messaggio successivo nella coda. Ciò garantirà che in un dato momento venga elaborato un solo messaggio tra tutti i consumatori?Il conteggio prefisso – indit

+0

limiterà il numero di messaggi non riconosciuti in un determinato canale (consumer, in pratica). se hai 3 istanze del tuo consumatore e ognuna di esse ha un prefetch di 1, avrai fino a 3 messaggi attualmente in fase di elaborazione –