2012-03-26 23 views
6

Mam już małą grupę rówieśników (na przykład 10 węzłów), które już publikują i subskrybują wiadomości. To działa dobrze. Klaster jest statyczny i każdy węzeł zna adres innych węzłów.Jaki jest najlepszy sposób wysyłania asynchronicznych wiadomości bez odpowiedzi między urządzeniami równorzędnymi za pomocą ØMQ?

W moim przypadku użycia potrzebuję również wszystkich węzłów, aby móc wysyłać wiadomości do dowolnego określonego węzła, a wszystkie węzły powinny nasłuchiwać wiadomości skierowanych do nich. Węzeł wysyłający nie potrzebuje odpowiedzi, nie musi czekać na odpowiedź i nie musi wiedzieć, że drugi węzeł otrzymał wiadomość.

Jakiego rodzaju wzoru i typów gniazd można użyć do realizacji tego?

Jestem całkiem nowy dla ØMQ i wyglądam na Freelance Pattern z przewodnika, dokładniej Model Three - Complex and nasty. Czy w moim przypadku stosuje się podejście ROUTER-ROUTER opisane w tym miejscu?

Zastanawiam się, czy pozwolić każdemu węzłowi połączyć się z gniazdem ROUTER ustawiając ich adres jako tożsamość (i "odpytując" ją w swojej pętli komunikatów), a także pozwalając węzłowi wysyłać na gniazdo ROUTER, określając adres węzła odbiorczego jako tożsamość.

Czy przegapiłem jakiś prostszy sposób na zrobienie tego? Korzystanie z powyższego podejścia wydaje się być może nieco skomplikowane, ponieważ naprawdę nie potrzebuję procedury uzgadniania, która umożliwia odbiorcy wysłanie odpowiedzi.

Odpowiedz

2

Za wysłanie pracy do rówieśnika bez potrzeby odpowiedzi, prawdopodobnie użyłbym wzoru Fanout, który pozwoli ci bardziej efektywnie "strzelać i zapomnieć".

Router i pośrednik naprawdę są dla warstwy "urządzenia" w "rozszerzonym" wzorze żądania/odpowiedzi.

+0

Może brakuje mi tu czegoś, ale w jaki sposób rozwijanie pozwala mi wysłać wiadomość tylko do określonego węzła? – tle

+2

Węzeł ma tylko jeden węzeł, a nie serię węzłów. Innymi słowy, gdy musisz użyć przypadku użycia "określonego węzła", masz jedną PUSH i pojedynczą parę PULL. Nie ma żadnych oczekiwań podczas wykonywania PUSH, że otrzymasz coś w zamian, więc moim zdaniem jest to lepsza asynchroniczna metafora niż REQ/REP. Możesz także do PUB/SUB między pojedynczymi węzłami, jeśli chcesz ponownie wykorzystać to, co już masz, architektonicznie. – Shaun

+1

PUSH-PULL nie będzie wysyłać wiadomości, jeśli odbiorca nie działa, zgodnie z dokumentem, co oznacza, że ​​jeśli twój zdalny węzeł zostanie wyłączony (osoba, z którą wysyłasz wiadomość) i wróci, otrzyma kilka starych wiadomości. Możesz oczywiście złagodzić ten problem, monitorując status odbiorcy (za pomocą pulsu lub odpowiednika) i zamykając gniazdo PUSh, gdy tylko węzeł zostanie wyłączony (prawdopodobnie z opóźnieniem = 0). –

Powiązane problemy