Witam ponownie.
Poprzedni wpis z tej serii w zasadzie wyczerpał podstawowe typy danych dostępne w Redisie. W tym artykule przyjrzymy się więc mechanizmowi pub-sub. Skrót ten rozwija się do publish-subscribe i jest on implementacją wzorca o tej samej nazwie.
Wzorzec publish-subscribe jest wzorcem wymiany komunikatów. Polega on na tym, że komponenty wysyłające wiadomości nie wysyłają ich do konkretnie określonej listy odbiorców. Można powiedzieć więcej – nie wiedzą nawet czy ktokolwiek wiadomość otrzyma. Podobnie ma się sprawa z komponentami odbierającymi wiadomości – nie wiedzą one kto wysyła daną wiadomość. Obie strony dzieli „kanał komunikatów”. To ten byt na który publikujący wypycha wiadomości i z którego subskrybent owe wiadomości odbiera.
Największą zaletą tego wzorca jest łatwość dodawania kolejnych elementów do już istniejącej układanki. Jest on bardzo odporny na rozbudowę „farmy” zarówno subskrybentów jak i publikujących. Zaleta ta, jeśli spojrzymy na nią pod innym kątem, jest również wadą. Tak silne rozdzielenie komponentów od siebie powoduje, że publikujący mogą wrzucać kolejne wiadomości gdy subskrybenci wcale nie nasłuchują na nie. Brakuje im po prostu wiedzy o tym ilu subskrybentów jest podłączonych.
Mówiąc obrazem, działa to tak:
A w naszym przypadku Message Broker to Redis.
Kanał komunikatów, wspomniany przeze mnie w poprzednim rozdziale, w redisie jest po prostu pewnym kluczem. Załóżmy, że w naszym przykładzie będzie to klucz o nazwie „testowa_kanal_komunikacyjny”. Napiszmy subskrybenta:
1 2 3 4 5 6 7 8 9 | from redis import Redis redis_connection = Redis(decode_responses=True) pubsub = redis_connection.pubsub() pubsub.subscribe("testowa_kanal_komunikacyjny") for message in pubsub.listen(): print(message) |
Po uruchomieniu tego kawałka kodu nasz subskrybent odbiera pierwszą wiadomość, tzw. powitalną, informującą, że się podłączyliśmy. Wygląda ona tak:
{'type': 'subscribe', 'pattern': None, 'channel': 'testowa_kanal_komunikacyjny', 'data': 1}
po czym blokuje się, w oczekiwaniu na kolejne komunikaty.
Teraz, jeśli skorzystamy z konsoli redis-cli i uruchomimy komendę:
publish testowa_kanal_komunikacyjny testowa_wiadomosc
to dostaniemy w naszym programie od razu wysłana wiadomość:
{'type': 'message', 'pattern': None, 'channel': 'testowa_kanal_komunikacyjny', 'data': 'testowa_wiadomosc'}
Aż tyle! Pozwala nam to na szybką komunikację międzyprocesową, a jeśli zachodzi potrzeba, to i pomiędzy osobnymi maszynami komunikacja zajdzie. Dodatkowo można się subskrybować nie na konkretny kanał, a na pattern, tzn jeśli w naszej aplikacji mamy kanały:
i chcielibyśmy, korzystając z jednego subskrybenta, podłączyć się do tych kanałów, możemy po prostu podłączyć się pod pattern „tasks_*”:
1 2 3 4 5 6 7 8 9 | from redis import Redis redis_connection = Redis(decode_responses=True) pubsub = redis_connection.pubsub() pubsub.psubscribe("tasks_*") for message in pubsub.listen(): print(message) |
i teraz, jeśli z konsoli wykonamy:
127.0.0.1:6379> publish tasks_1 test (integer) 1 127.0.0.1:6379> publish tasks_2 test (integer) 1 127.0.0.1:6379> publish tasks_3 test (integer) 1
to dostaniemy w programie:
{’type’: 'pmessage’, 'pattern’: 'tasks_*’, 'channel’: 'tasks_1′, 'data’: 'test’}
{’type’: 'pmessage’, 'pattern’: 'tasks_*’, 'channel’: 'tasks_2′, 'data’: 'test’}
{’type’: 'pmessage’, 'pattern’: 'tasks_*’, 'channel’: 'tasks_3′, 'data’: 'test’}
Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More
Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More
Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More
Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More