2011-08-25 16 views
14

Mam 2 usługi. Obydwaj muszą subskrybować ten sam kanał.Konkurencja Konsumenta w Redis Pub/Sub jest obsługiwana?

Obie usługi są zrównoważone pod względem obciążenia. Każda usługa działa na wielu serwerach.

Jak więc mogę się upewnić, że tylko 1 wystąpienie każdej usługi powoduje, że wiadomość z tego kanału jest zajęta.

Czy jest to obsługiwane w Redis?

Dzięki

Odpowiedz

19

PubSub nie działa w ten sposób - komunikat trafia do wszystkich podłączonych klientów subskrybowanych. Można jednak ustawić go tak, aby kanał był powiadomieniem o aktualizacji listy. W ten sposób wszyscy klienci otrzymają wiadomość, ale tylko jeden może pobrać przedmiot z listy za pomocą LPOP.

+0

To świetny pomysł. Czy mógłbyś wyjaśnić więcej szczegółów na temat "konfiguracji, aby kanał był powiadomieniem o aktualizacji listy". dzięki – jordan

+3

Wystarczy uruchomić dwa polecenia, gdy wysyłasz wiadomość - jeden RPUSH i jeden PUBLISH. Kiedy klient otrzymuje wiadomość za pomocą SUBSCRIBE, niech wywoła LPOP na liście. Jeśli LPOP nie zwraca niczego, inny pracownik już przetworzył komunikat, aby można go było zignorować. –

+0

Ale wtedy wydawca musi znać subskrybenta i przerwać obserwację. na przykład Teraz mój wydawca wie, że 2 usługi zużywają wiadomość. Więc potrzebuję wysłać 2 RPUSH na 2 kanały. Każdy kanał mapuje do usługi. Nie jestem pewien, czy w pełni rozumiem twój pomysł? dzięki – jordan

21

Innym podejściem byłoby użycie B*POP ze swoich wystąpień serwisowych. Jeśli masz wielu klientów z numerem B*POP na liście, za każdym razem, gdy otrzymasz od nich LPUSH, jeden z tych klientów otrzyma dane, ale tylko jeden.

+3

Jestem prawie pewien, że to jest właściwa rzecz do zrobienia. – djechlin

+2

'while (true) {BLPOP}' jest naprawdę proste, dzięki! – soulmachine