Udostępnij za pośrednictwem


Ograniczanie dystrybucji komunikatów

Kanał równorzędny jest zgodnie z projektem siatką emisji. Jego podstawowy model zalewania obejmuje dystrybucję każdego komunikatu wysyłanego przez dowolnego członka siatki do wszystkich innych elementów członkowskich tej siatki. Jest to idealne rozwiązanie w sytuacjach, w których każda wiadomość wygenerowana przez członka jest odpowiednia i przydatna dla wszystkich innych członków (na przykład pokoju rozmów). Jednak wiele aplikacji ma okazjonalną potrzebę ograniczenia dystrybucji komunikatów. Jeśli na przykład nowy element członkowski łączy siatkę i chce pobrać ostatni komunikat wysłany przez siatkę, to żądanie nie musi być zalane do każdego elementu członkowskiego siatki. Żądanie może być ograniczone do bliskich sąsiadów lub odfiltrowane lokalnie komunikaty. Komunikaty można również wysyłać do pojedynczego węzła w siatce. W tym temacie omówiono używanie liczby przeskoku, filtru propagacji komunikatów, filtru lokalnego lub bezpośredniego połączenia w celu kontrolowania sposobu przekazywania komunikatów w całej siatce oraz ogólnych wytycznych dotyczących wybierania podejścia.

Liczba przeskoków

Koncepcja jest podobna PeerHopCount do czasu wygaśnięcia (czas wygaśnięcia) używany w protokole IP. Wartość PeerHopCount elementu jest powiązana z wystąpieniem komunikatu i określa, ile razy komunikat powinien zostać przesłany dalej przed usunięciem. Za każdym razem, gdy klient kanału równorzędnego odbiera komunikat, sprawdza, czy PeerHopCount określono komunikat. Jeśli zostanie określona, klient odkreśli wartość liczby przeskoków o jedną przed przekazaniem komunikatu do sąsiednich węzłów. Gdy klient odbiera komunikat z wartością liczby przeskoków o wartości zero, klient przetwarza komunikat, ale nie przekazuje komunikatu do sąsiadów.

Liczba przeskoku może zostać dodana do komunikatu przez dodanie PeerHopCount jako atrybutu do odpowiedniej właściwości lub pola w implementacji klasy komunikatów. Można ustawić tę wartość na określoną wartość przed wysłaniem komunikatu do siatki. W ten sposób można użyć liczby przeskoku, aby ograniczyć rozkład komunikatów w całej siatce w razie potrzeby, potencjalnie unikając niepotrzebnego duplikowania komunikatów. Jest to przydatne w przypadkach, gdy siatka zawiera dużą ilość nadmiarowych danych lub wysyła komunikat do natychmiastowych sąsiadów lub sąsiadów w kilku przeskokach.

Filtr propagacji komunikatów

MessagePropagationFilter można użyć do dostosowanej kontroli powodzi komunikatów, zwłaszcza gdy zawartość komunikatu lub inne konkretne scenariusze określają propagację. Filtr podejmuje decyzje dotyczące propagacji dla każdego komunikatu przechodzącego przez węzeł. Dotyczy to komunikatów, które pochodzą z innego miejsca w siatce odebranej przez węzeł, a także komunikatów utworzonych przez aplikację. Filtr ma dostęp zarówno do komunikatu, jak i jego źródła, więc decyzje dotyczące przekazywania lub porzucania wiadomości mogą być oparte na dostępnych pełnych informacjach.

PeerMessagePropagationFilter jest klasą abstrakcyjną podstawową z pojedynczą funkcją ShouldMessagePropagate. Pierwszy argument wywołania metody przekazuje pełną kopię komunikatu. Wszelkie zmiany wprowadzone w wiadomości nie mają wpływu na rzeczywisty komunikat. Ostatni argument wywołania metody identyfikuje źródło komunikatu (PeerMessageOrigination.Local lub PeerMessageOrigination.Remote). Konkretne implementacje tej metody muszą zwracać stałą z PeerMessagePropagation wyliczenia wskazującego, że komunikat ma być przekazywany do aplikacji lokalnej (), przekazywany do klientów zdalnych (RemoteLocal), obu (LocalAndRemote) lub nie (None). Ten filtr można zastosować, korzystając z odpowiedniego PeerNode obiektu i określając wystąpienie klasy filtru propagacji pochodnej PeerNode.MessagePropagationFilter we właściwości . Przed otwarciem kanału równorzędnego upewnij się, że filtr propagacji jest dołączony.

Kontaktowanie się z pojedynczym węzłem w siatce

Poszczególne węzły w siatce można nawiązać z siecią, konfigurując filtr lokalny lub konfigurując bezpośrednie połączenie.

Jeśli węzły w siatce mają indywidualny identyfikator, identyfikator docelowy można określić w implementacji komunikatu. Filtr lokalny można skonfigurować, pisząc funkcję w kontrakcie komunikatów, która będzie wyświetlać komunikat tylko w bieżącym węźle, jeśli jego identyfikator jest zgodny z określonym identyfikatorem docelowym. Siatka transportuje komunikat, więc obciążenie związane z konfigurowaniem nowego połączenia nie musi być naliczane. Jednak istnieje utrata wydajności, ponieważ komunikat jest wysyłany wiele razy w całej siatki. Działa to dobrze w przypadku wysyłania komunikatów do poszczególnych członków siatki, o ile komunikaty nie są zbyt duże ani zbyt częste.

W przypadku długotrwałych połączeń o wysokiej przepustowości zaleca się bezpośrednie połączenia. Informacje o połączeniu można wysyłać za pośrednictwem siatki, a następnie skonfigurować bezpośrednie połączenie wybrane do wysyłania/odbierania komunikatów.

Wybieranie podejścia do ograniczania dystrybucji komunikatów

W przypadku odnajdywania scenariusza, w którym należy ograniczyć dystrybucję komunikatów, zadaj sobie następujące pytania:

  • KtoTo musi zostać wyświetlony komunikat? Tylko jeden węzeł sąsiada? Węzeł gdzie indziej w siatce? Połowa siatki?

  • Jak często ta wiadomość zostanie wysłana?

  • Jakiego rodzaju przepustowość będzie używać ten komunikat?

Odpowiedzi na te pytania mogą pomóc w ustaleniu, czy należy użyć funkcji Liczba przeskoku, filtr propagacji komunikatów, filtr lokalny lub bezpośrednie połączenie. Zapoznaj się z następującymi ogólnymi wytycznymi:

  • KtoTo

    • Pojedynczy węzeł: filtr lokalny lub połączenie bezpośrednie.

    • Sąsiedzi w określonym sąsiedztwie: PeerHopCount.

    • Podzbiór złożony siatki: MessagePropagationFilter.

  • Jak często

    • Bardzo często: bezpośrednie połączenie, PeerHopCount, MessagePropagationFilter.

    • Od czasu do czasu: filtr lokalny.

  • Użycie przepustowości

    • Wysoki: Bezpośrednie połączenie, mniej zalecane, aby użyć filtru MessagePropagationFilter lub filtru lokalnego.

    • Niski: Każde, bezpośrednie połączenie prawdopodobnie nie jest potrzebne.

Zobacz też