2011-10-05 17 views
17

En una aplicación web, si necesito escribir un evento en una cola, me conectaría con redis para escribir el evento.¿El redis pub/submodelo requiere conexiones persistentes a redis?

Ahora, si quiero otro proceso de servidor (digamos un daemon o un trabajo cron) para procesar o reaccionar a la publicación del evento en redis, ¿necesito una conexión persistente?

Poco confuso sobre cómo funciona este proceso de pub/sub en una aplicación web.

+0

Algunas ideas simples (1 parche de línea) para agregar persistencia para PubSub de forma nativa en Redis - http://abhinavsingh.com/customizing-redis-pubsub-for-message-persistence-part-2/ –

Respuesta

2

No estoy del todo seguro, pero creo que sí, pub/sub requiere una conexión persistente.

Para una alternativa me gustaría echar un vistazo a resque y cómo se encarga de eso. En lugar de utilizar pub/sub, simplemente agrega un elemento a una lista en redis, y luego cualquier trabajo de daemon o cron que tenga puede usar el comando lpop para obtener el primero.

Lo siento solo por dar una pseudo respuesta y luego un enchufe.

42

Básicamente en Redis hay dos modelos diferentes de mensajería:

  • dispara y olvida/uno a muchos: Pub/Sub. En el momento en que se publica un mensaje, todos los suscriptores lo recibirán, pero este mensaje se perderá para siempre. Si un cliente no estaba suscrito, no hay manera de que pueda recuperarlo.
  • Colas persistentes/One to One: listas, posiblemente usadas con comandos de bloqueo como BLPOP. Con las listas, tiene un productor presionando en una lista y uno o más consumidores esperando elementos, pero un mensaje llegará solo a uno de los clientes que esperan. Con las listas, tiene persistencia y los mensajes esperarán a que un cliente los muestre en lugar de desaparecer. Entonces, incluso si nadie está escuchando, hay un retraso acumulado (tan grande como la memoria disponible, o puede limitar el trabajo atrasado usando LTRIM).

Espero que esto esté claro. Sugiero que el estudio de los siguientes comandos para entender más sobre Redis y la semántica de los mensajes:

  • LPUSH/RPUSH, RPOP/LPOP, BRPOP/BLPOP
  • PUBLICAR, SUSCRIPCIÓN, PSUBSCRIBE

Doc para este los comandos están disponibles en redis.io

+0

, entonces ¿necesito una conexión persistente como suscriptor? – codecompleting

+5

Con Pub/Sub, sí. Mira [esto] (http://blog.joshsoftware.com/2011/01/03/do-you-need-a-push-notification-manager-redis-pubsub-to-the-rescue/) para ver un ejemplo sobre cómo lograr mensajes persistentes con Pub/Sub y un cliente de ruby ​​personalizado. – cbrauchli