Jakie są rozwiązania problemu z kolejką rozproszoną?

23

Próbuję dowiedzieć się więcej o różnych sposobach rozwiązania problemu kolejki rozproszonej. Chciałbym więc wiedzieć, jakie produkty, usługi, wdrożenia i dokumenty badawcze już tam są.

Wdrożenie stanie przed wieloma wyzwaniami i będzie zmuszone do kompromisów:

  • Czy ma mocne czy luźne zamówienie?
  • Czy jest to idempotentne?
  • Czy możemy mieć więcej kolejek niż może zmieścić się na jednym komputerze?
  • Czy możemy mieć więcej danych w kolejce niż to, co zmieści się na jednym komputerze?
  • Ile maszyn może ulec awarii, zanim potencjalnie stracimy dane?
  • Czy może tolerować podział sieci?
  • Czy może automatycznie uzgadniać dane po naprawieniu podziału sieci?
  • Czy może zagwarantować dostawę w przypadku awarii klienta?
  • Czy może zagwarantować, że ta sama wiadomość nie zostanie dostarczona więcej niż jeden raz?
  • Czy węzeł może zawiesić się w dowolnym momencie, wrócić i nie wysyłać śmieci?
  • Czy można dodawać i usuwać węzły z działającego klastra bez przestojów?
  • Czy można uaktualnić węzły w działającym klastrze bez przestojów?
  • Czy może działać bez problemów na heterogenicznych serwerach?
  • Czy potrafisz „przykleić” kolejki do grupy serwerów? (przykład: „te kolejki są dozwolone tylko w europejskim centrum danych”)
  • Czy można umieścić repliki danych w co najmniej dwóch centrach danych, jeśli są one dostępne?

Nie mam złudzeń, że każde wdrożenie będzie w stanie powiedzieć „tak” na to wszystko. Chcę jedynie usłyszeć o różnych wdrożeniach; jak działają, jakie kompromisy dokonali i może dlaczego zdecydowali się na konkretny zestaw kompromisów.

Także jeśli na powyższej liście są jakieś wyzwania, które mogłem przeoczyć.

Chris Vest
źródło

Odpowiedzi:

13

Pisanie podstawowego systemu kolejkowania jest dość proste, ale jak zauważyłeś powyżej przy wszystkich wyzwaniach, robienie tego dobrze jest inną sprawą. Korzystałem z domowych systemów, dla których napisałem kod źródłowy, systemy innych firm i różnych dostawców JMS. JMS (Java Messaging Service) jest jak dotąd najbardziej kompletnym rozwiązaniem, jakie do tej pory spotkałem. Wiele pytań jest dostępnych w JMS. Moim ulubionym dostawcą JMS jest ActiveMQ. Bezpłatne, wydajne, łatwe w instalacji i, co ważniejsze, łatwe do osadzenia w mojej aplikacji z Spring. Dostawcy JMS nie dostarczają wszystkiego, o co prosili po wyjęciu z pudełka, ale zapewniają zestaw narzędzi do obsługi większości zapytań, jeśli aplikacja tego potrzebuje. Nie znalazłem, żeby wiele aplikacji potrzebowało wszystkiego, co wymieniłeś. Kolejność może nie być ważna (najlepiej, jeśli nie jest),

http://activemq.apache.org/what-open-source-integration-solution-works-best-with-activemq-.html

Czy ma mocne lub stracił porządek? Tak. Oba mają w zależności od potrzeb programów. Oto szczegóły: http://activemq.apache.org/total-ordering.html .

Czy ma idempotent? Nie, ale jest to trywialne do wdrożenia w warstwie aplikacji, jeśli jest to potrzebne.

Czy możemy mieć więcej kolejek niż może zmieścić się na jednym komputerze? Tak. Możesz mieć serwery klastrowane, a jeśli chcesz skonfigurować wiele komputerów z różnymi kolejkami, możesz to zrobić i pobrać z obu.

Czy możemy mieć więcej danych w kolejce niż to, co zmieści się na jednym komputerze? Tak, większość dostawców JMS musi używać pewnego rodzaju DB / pamięci trwałej, aby upewnić się, że wiadomości nie zostaną upuszczone lub utracone w przypadku awarii dostawcy JMS.

Ile maszyn może ulec awarii, zanim potencjalnie stracimy dane? Odpowiedź jest nieco trudniejsza, ponieważ wiąże się z czasem. Można jednak zawiesić dostawcę JMS i pod warunkiem, że dysk nie jest uszkodzony, wróci i uruchomi się w miejscu, w którym otrzymał ostatnie zatwierdzenie. Oznacza to, że wiadomości mogą być dostarczane dwa razy, ale jeśli kodujesz swoją aplikację, aby to obsłużyć, nie stanowi to problemu. Dopóki masz co najmniej jeden z każdego typu (producenci, konsumenci lub serwery JMS), zostanie on ukończony. Możesz także mieć obciążenie / saldo / przełączanie awaryjne w celu uzyskania nadmiarowości, jeśli dysk zostanie wyłączony.

Czy może tollerować podział netto? Myślę, że rozumiem, co masz na myśli przez „podział sieci”, ale nie jestem do końca pewien. Myślę, że masz na myśli, że jeśli serwery JMS są zgrupowane, a my stracimy połączenie z jednym z serwerów, czy przeskoczy na inny serwer i odbierze tam, gdzie zostało przerwane. Tak, ale ponownie tego rodzaju sytuacje mogą prowadzić do duplikowania wiadomości w zależności od tego, w którym momencie klient utracił połączenie.

Czy może automatycznie uzgadniać dane po naprawieniu podziału sieci? Jeśli korzystasz z sesji transakcyjnych, ponownie dostarczy tylko komunikat, który wywołał zatwierdzenie, do istniejących klientów, którzy działają.

Czy może zagwarantować dostawę w przypadku awarii klienta? Tak, jest to jeden z głównych celów JMS. Gwarantowana dostawa oznacza, że ​​jeśli wiadomość jest w kolejce, gwarantuje, że zostanie obsłużona przez klienta.

Czy może zagwarantować, że ta sama wiadomość nie zostanie dostarczona więcej niż jeden raz? Tak, jeśli używane są sesje transakcyjne. Oznacza to, że klient zaakceptował komunikat i wywołał zatwierdzenie / wycofanie. Po wywołaniu zatwierdzenia wiadomość nie zostanie ponownie dostarczona.

Czy węzeł może zawiesić się w dowolnym momencie, wrócić i nie wysyłać śmieci? W przypadku trwałych kolejek klastrowych. Tak, nie wyrzuci „śmieci”, jeśli inny węzeł w klastrze dostarczy wiadomość. Nadal może dostarczyć ponownie wszystko, co nie zostało potwierdzone.

Czy można dodawać i usuwać węzły z działającego klastra bez przestojów? Tak.

Czy można uaktualnić węzły w działającym klastrze bez przestojów? Odpowiedź na to pytanie jest nieco trudniejsza, ale wierzę, że tak, możesz to zrobić.

Czy może działać bez problemów na heterogenicznych serwerach? Co to dokładnie znaczy? Odkryłem, że większość dostawców JMS jest bardzo łatwa do uruchomienia w środowiskach korzystających z innego sprzętu, systemu operacyjnego itp. Chociaż, jeśli chodzi o wydajność, to zupełnie inna sprawa. Wolny węzeł może mieć negatywny wpływ na każdy rozproszony system przetwarzania. Miałem 2 8 rdzeniowych serwerów Intel obsługujących kolejkę i klientów. To razem 16 rdzeni i uzyskałem lepszą wydajność, używając tylko tych dwóch urządzeń, niż gdy dodałem maszynę z jednym rdzeniem jako konsument. Ta jednordzeniowa maszyna była tak wolniejsza, że ​​spowolniła całą sieć dwukrotnie. Nie miało to nic wspólnego z JMS.

Czy potrafisz „przykleić” kolejki do grupy serwerów? Krótka odpowiedź tak. Mogę wymyślić sposób, w jaki możesz uruchomić klaster, który jest tylko w europejskim centrum danych, i skonfigurować tam kolejkę. Następnie w konfiguracji wiosennej skonfiguruj klientów do korzystania z tej kolejki oraz innych kolejek w innych klastrach. Możesz zajrzeć do dokumentacji:

http://activemq.apache.org/clustering.html

Czy można umieścić repliki danych w co najmniej dwóch centrach danych, jeśli są one dostępne? Ponownie uważam, że tak, ale najlepiej skonsultować dokumenty klastrowe.

Ponownie JMS ma wiele opcji, które możesz modyfikować w zależności od potrzeb. Korzystanie z transakcji i trwałych kolejek wiąże się z kosztem wydajności. Widziałem, jak włączenie wszystkich dzwonków i gwizdków wpływa na wydajność aż 10-krotnie. Gdy użyłem JBossMQ, jeśli wyłączyliśmy niektóre z tych funkcji, moglibyśmy uzyskać około 10 000 wiadomości / s, ale włączenie ich zmniejszyło nas do 1000 wiadomości / s. Duża kropla.

chubbsondubs
źródło
Dziękujemy za poświęcenie czasu na odpowiedź. Podział sieci ma miejsce, gdy niektóre węzły w klastrze nie mogą już komunikować się z resztą. Przez heterogeniczne serwery rozumiem głównie różne ilości pamięci RAM - niektóre systemy rozproszone wolą ją, gdy serwery wyglądają podobnie.
Chris Vest
Na pewno tak na netsplits. Jeśli konsument upada lub nie może się komunikować, będzie próbował się połączyć. Zlecenia, które zostały mu przekazane, a które nie otrzymały zatwierdzenia, zostaną później dostarczone do innych konsumentów. Jeśli dostawca JMS ulegnie awarii, a inni członkowie komunikatów klastra mogą zostać powieleni w klastrze, aby zapobiec utracie wiadomości.
chubbsondubs,
Nie ma żadnych wymagań dotyczących identyczności maszyn, niezależnie od tego, czy są to RAM, sprzęt czy system operacyjny. W razie potrzeby możesz uruchomić mieszany zestaw maszyn. Jedyny problem, który zauważyłem, dotyczy wydajności, ponieważ maszyny, które nie są takie same, przetwarzają komunikaty z różną prędkością, co może prowadzić do niższej przepustowości. Jednak model JMS nieco to łagodzi, ponieważ jest to model pull zamiast push. Modele push są znacznie bardziej wrażliwe na tego typu problemy.
chubbsondubs,