2011-08-25 13 views
14

Tengo 2 servicios. Ambos necesitan suscribirse al mismo canal.Consumidor competente en Redis Pub/Sub supported?

Los 2 servicios tienen equilibrio de carga. Cada servicio se ejecuta en varios servidores.

Entonces, ¿cómo puedo estar seguro de que solo 1 instancia de cada servicio consume el mensaje de ese canal?

¿Es compatible con Redis?

Gracias

Respuesta

19

PubSub no funciona de esa manera - el mensaje va a todos los clientes suscritos conectados. Sin embargo, puede configurarlo para que el canal sea una notificación de actualización de una lista. De esta forma, todos los clientes recibirán el mensaje, pero solo uno puede tomar el elemento de la lista con LPOP.

+0

Esa es una gran idea. ¿Podría explicar más detalles sobre "configurarlo para que el canal sea una notificación de actualización de una lista"? gracias – jordan

+3

Simplemente ejecute dos comandos cuando envíe un mensaje: uno RPUSH y otro PUBLICO. Cuando un cliente recibe un mensaje usando SUBSCRIBE, haga que llame a LPOP en la lista. Si LPOP no devuelve nada, otro trabajador ya ha procesado el mensaje para que pueda ser ignorado. –

+0

Pero luego el editor necesita conocer al suscriptor y romper el patrón de observación. p.ej. Ahora mi editor sabe que hay 2 servicios que consumen el mensaje. Entonces necesito enviar 2 RPUSH a 2 canales. Cada canal se asigna a un servicio. ¿No estoy seguro si entiendo completamente tu idea? gracias – jordan

21

Otro enfoque sería utilizar B*POP desde sus instancias de servicio. Si tiene muchos clientes ejecutando B*POP en una lista, siempre que tenga LPUSH, uno de esos clientes obtendrá los datos, pero solo uno.

+3

Estoy bastante seguro de que esto es lo que hay que hacer aquí. – djechlin

+2

'while (true) {BLPOP}' es realmente simple, gracias! – soulmachine

Cuestiones relacionadas