nServiceBus–Gateways, część VII

Dzisiaj o implementacji wzorca gateway w NSB. Wzorzec bramki jest bardzo znany, ale w programowaniu rozproszonym ma swoją konkretną implementację. Bardzo często jest nadużywany i dlatego kluczowe jest jak działa jego implementacja w NSB oraz kiedy należy z niej korzystać.

Brama w NSB to punkt dostępowy do systemu, który jest wykorzystywany, gdy dwa węzły znajdują się poza LAN\VPN.  Innymi słowy, jeśli dwa serwisy są publiczne (połączone Internetem) wtedy nie możemy skorzystać ze standardowego mechanizmu kolejek Windows i musimy zastosować np. protokół HTTP lub HTTPS. Bramki nie mają sensu w lokalnych sieciach, gdzie najlepszą technologią są czyste kolejki – zapewniają wydajność i gwarancje dostarczenia wiadomości, nawet jak sieć będzie tymczasowo niedostępna.

Załóżmy, że mamy dwa serwisy NodeA oraz NodeB, które umieszczone są w kompletnie dwóch różnych lokalizacjach. Bramki będą stanowić zwykłe handlery i mogą wyglądać następująco:

public class SendEmailHandler : IHandleMessages<Email> { public IBus Bus { get; set; } public void Handle(Email email) { // jakis kod Bus.Reply<EmailSent>(m=> { m.Id = email.Id; }); }

W tym momencie kod jeszcze niczym nie różni się od klasycznego handler’a. To, że handler będzie wyeksponowany jako bramka, zależy wyłącznie od konfiguracji:

public class EndpointConfig : IConfigureThisEndpoint, AsA_Server { public void Customize(BusConfiguration configuration) { configuration.UsePersistence<RavenDb>(); configuration.EnableFeature<Gateway>(); } }

EnableFeature<Gateway> to pierwsza zmiana, jaką musimy dokonać. Kolejna konfiguracja to plik .config, gdzie musimy zawrzeć następującą deklarację:

<GatewayConfig TransactionTimeout="00:10:00"> <Channels> <Channel Address="http://localhost:8081/NodeA/" ChannelType="Http" Default="true" /> </Channels> </GatewayConfig>

Za pomocą tego adresu, będziemy mogli wysyłać wiadomości do bramki NodeA. Analogicznie sytuacja wygląda oczywiście z NodeB.

Następnie z dowolnego miejsca możemy wysyłać wiadomości do bramek za pomocą SendToSites:

Bus.SendToSites(new[] { "NodeA", "NodeB" }, new Email { ID=1, Content="test" });

Niezbędna jest również konfiguracja danego węzła, który będzie komunikował się z innymi bramkami:

<GatewayConfig> <Sites> <Site Key="NodeA" Address="http://localhost:8081/NodeA/" ChannelType="Http" /> <Site Key="NodeB" Address="http://localhost:8081/NodeB/" ChannelType="Http" LegacyMode="false" /> </Sites> <Channels> <Channel Address="http://localhost:8081/Master/" ChannelType="Http" /> </Channels> </GatewayConfig>

Powyższa sekcja z pliku konfiguracyjnego, definiuje adres danej bramki (Channel) jak i innych bramek za pomocą sekcji <Sites>. Innymi słowy, będziemy mieli w systemie węzły Master, NodeA, NodeB:

image

Oczywiście również należy pamiętać o EnableFeature<Gateway> dla węzła master.

Wiadomości są zatem wysyłane za pomocą HTTP\HTTPS. Załóżmy, że master chce wysłać komendę do NodeA. Na początku zostanie ona umieszczona w kolejce jak to w klasycznych systemach kolejkowych. Następna bramka zdejmie wiadomość z kolejki i wyśle ją przez HTTP\HTTPS do bramki NodeA. Bramka NodeA przyjmie połącznie HTTP\HTTP, odtworzy wiadomość i policzy hash danej wiadomości.  W kolejnym etpaie hash zostanie odesłany do master i jeśli zgadzają się, tzn. jeśli hash wiadomości wysłanej i odebranej są takie same, wtedy NodeA umieści wiadomość w kolejce wiadomości przychodzących. Dalsze etapy są już standardowe czyli w momencie, gdy tylko będzie to możliwe, wiadomość zostanie przetworzona przez handler. W przypadku, gdy hash’e nie będą zgadzały się, proces będzie rozpoczęty od nowa.

Podsumowując jeszcze raz, jeśli mamy VPN\LAN to możemy zapomnieć o bramkach i korzystać z czystych kolejek. NSB dostarcza jednak bardzo łatwo konfigurację i przełączenie się między zwykłym handlerem, a bramką jest bardzo szybkie. Implementacja gwarantuje, że wszelkie duplikaty wiadomości zostaną rozpoznane i usunięte. W przypadku błędów w przetwarzaniu wiadomości również zostanie zastosowany mechanizm automatycznego powtarzania opisany w poprzednich już postach.

Leave a Reply

Your email address will not be published.