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.