2015-11-16 15 views

Odpowiedz

24

Bardzo często badałem ten temat (do zastosowania w mojej pracy dla NServiceBus i MessageHandler) i chciałbym przedstawić moje przemyślenia na ten temat. Jednak nie określiłem jeszcze najlepszego modelu.

Jeśli pominąć praktyczną realizację z ServiceFabric chciałbym kategoryzować proponowanego podejścia w następującej kolejności, jeśli chodzi o niezawodność:

  • c) sklepu i modelu przodu jest prawdopodobnie najlepszy z modeli 3, gdy chodzi o komunikację między usługami, wszystkie usługi mogą działać niezależnie od siebie i nie są w żaden sposób podatne na przerwy w sieci (z dodatkowym opóźnieniem).
  • A) Kolejka wejściowa dla każdej usługi: Każda usługa wolna od skutków awarii sieci dla to jest własna praca. Jednak, gdy chce wysyłać wiadomości do innej usługi, może to mieć wpływ na przerwy w sieci i konieczność ponownego zainicjowania w celu dostosowania się do tego.
  • B) Kolejka wyjściowa dla każdej usługi: jest prawdopodobnie najmniejszym z 3 modeli, ponieważ każda usługa jest bezpośrednio zależna od zasobu innych, co powoduje dużą zależność od dostępności sieci między węzłami.

Jeśli spojrzeć na to z punktu widzenia prostoty widzenia, chciałbym kategoryzować je w następujący sposób

  • A) kolejki na wejściu usługi: Jako źródło wiadomość musi aktywnie wiadomości trasy do danej kolejka docelowa jest dość prosta w implementacji procesów biznesowych lub przepływów pracy (co zakładam, że twój potok będzie reprezentował) za pomocą wzorca routingu (statycznego lub dynamicznego z wykorzystaniem wzoru poślizgu trasy). routing jest wyraźną częścią twojej implementacji, więc zarówno statyczne, jak i dynamiczne schematy routingu są możliwe, ho Praktyczne wdrażanie jest trudniejsze, ponieważ trzeba zbudować i zarządzać pakietem komunikatów, który przesyła komunikaty z kolejki przesyłania (danych wyjściowych) do kolejki docelowej i powiązaną z nią potrzebę przepływu kontekstu ze źródła komunikatu do pompy komunikatów. (Bezwstydna wtyczka: NServiceBus to framework, który może zabrać ze sobą złożoność i uczynić ten scenariusz tak prostym, jak A)
  • B) Kolejka wyjściowa dla każdej usługi: Każda usługa musi być skonfigurowana tak, aby była jawnie odczytywana z kolejki innej osoby, to podejście zezwala tylko na statyczne trasowanie, ponieważ reguły routingu są osadzone w miejscu, w którym czytasz tylko (to poważnie ogranicza cię z perspektywy funkcjonalnej).

Jeśli weźmiemy pod uwagę szczegóły implementacji ServiceFabric, to zakładam, że chcesz użyć implementacji IReliableQueue? Ta implementacja ma jednak pewne braki, które sprawiają, że zastanawiam się, czy te wzorce mogą być właściwie implementowane w macierzystej infrastrukturze pamięci ServiceFabric.

  1. infrastruktury magazynowej jest dostępny wyłącznie na usługach statefull usługi tak bezpaństwowe (jak Rest API lub inny bramy zakończenie protokół) nie może być częścią rurociągu (zazwyczaj ma zostać jedną z nich jako punkt wejścia)
  2. Tylko 1 wątek może uzyskać dostęp do niezawodnej kolejki w tym samym czasie, więc niemożliwe jest pisanie i odczytywanie z tej samej kolejki w tym samym czasie. To poważnie ogranicza przepustowość kolejki.
  3. Dostęp do niezawodnej kolejki wymaga transakcji lokalnej, ale te transakcje są ograniczone do jednej partycji. Więc nie jest również możliwe skalowanie twoich usług statefull, aby stworzyć konkurencyjny wzór konsumencki.

Biorąc pod uwagę te braki, nadal jestem skłonny użyć innego rodzaju kolejek infrastruktury SF Services zamiast modelu trwałości SF, na przykład Azure Service Bus lub Azure Storage (kolejki NserviceBus który pozwala również).

Krótko mówiąc, będę obsługiwał zarówno A, jak i C, z niewielką preferencją dla C, ale nie jestem przekonany o używaniu rzetelnych kolejek jako implementacji, dopóki te uchybienia nie zostaną rozwiązane.

+2

Yves, nigdy nie widziałem tak szczegółowej odpowiedzi, tak bardzo pomogłeś! Teraz zdecydowanie myślę o modelu ** C ** (store and forward). W pewnym sensie jest to Oddzielenie obaw. Nadal wolę nie korzystać z innych usług Azure PaaS. Wkroczę głębiej w SF dzięki nowym nowym wytycznym. Dziękuję Ci! – AsValeO

+1

I przy okazji 'IReliableQueue' jest dokładnie tym, o czym myślę. Teraz widzę, że ma minusy. – AsValeO

+2

Mam nadzieję, że zespół deweloperów rozwiąże te problemy, lokalny transport będzie bardzo atrakcyjny dla pewnych/wielu scenariuszy. –

Powiązane problemy