2011-08-25 4 views
14

Ho 2 servizi. Entrambi devono iscriversi allo stesso canale.Consumatori concorrenti su Redis Pub/Sub supportati?

I 2 servizi sono bilanciati. Ogni servizio viene eseguito su più server.

Quindi, come posso essere sicuro che solo 1 istanza di ciascun servizio consumi il messaggio di quel canale.

È supportato su Redis?

Grazie

risposta

19

PubSub non funziona in questo modo - il messaggio va a tutti i client connessi sottoscritti. Tuttavia, è possibile configurarlo in modo che il canale sia una notifica di un aggiornamento a un elenco. In questo modo tutti i client riceveranno il messaggio, ma solo uno può prendere l'elemento dalla lista con LPOP.

+0

Questa è una grande idea. Potresti spiegare maggiori dettagli su "configuralo in modo che il canale sia una notifica di un aggiornamento di un elenco". grazie – jordan

+3

Esegui semplicemente due comandi quando invii un messaggio: un RPUSH e uno PUBLISH. Quando un client riceve un messaggio utilizzando SUBSCRIBE, chiamalo LPOP nell'elenco. Se LPOP non restituisce nulla, un altro lavoratore ha già elaborato il messaggio in modo che possa essere ignorato. –

+0

Ma poi l'editore deve conoscere l'abbonato e interrompere il modello di osservazione. per esempio. Ora il mio editore sa che ci sono 2 servizi che consumano il messaggio. Quindi ho bisogno di inviare 2 RPUSH a 2 canali. Ogni mappa canale per un servizio. Non sono sicuro se comprendo pienamente la tua idea? grazie – jordan

21

Un altro approccio sarebbe quello di utilizzare B*POP dalle istanze di servizio. Se ci sono molti client che eseguono B*POP in un elenco, ogni volta che si aggiunge a LPUSH uno di quei client riceverà i dati, ma solo uno.

+3

Sono abbastanza sicuro che questa è la cosa giusta da fare qui. – djechlin

+2

'while (true) {BLPOP}' è davvero semplice, grazie! – soulmachine