2012-02-15 21 views
6

Mam klaster serwerów sieci Web, z których każdy ma tę samą aplikację internetową java. Wszystkie te wystąpienia aplikacji sieciowej korzystają z tej samej bazy danych (do przechowywania danych) i tego samego sieciowego przechowywania plików (gdzie przechowują niektóre wymagane pliki).Synchronizacja aplikacji internetowych w klastrze

Potrzebuję mieć możliwość synchronizowania wystąpień aplikacji internetowych. Na przykład jedna z instancji aplikacji otrzymuje określone żądanie od klienta, wykonuje kilka ponownych obliczeń i aktualizuje wewnętrzną pamięć podręczną. W tym momencie muszę zaktualizować wewnętrzne pamięci podręczne dla wszystkich innych aplikacji internetowych w klastrze, aby każdy z nich działał na tym samym zbiorze danych.

Jaki byłby najlepszy sposób uzyskania takiej funkcjonalności? Na pewno mogę zaimplementować jakiś niestandardowy komponent, który będzie okresowo odpytywał udostępniony zasób (flaga w tabeli bazy danych lub plik w magazynie plików) i zainicjował wymagane przetwarzanie po spełnieniu warunku. Ale może istnieje już biblioteka/komponent/aplikacja, z których mogę korzystać?

+0

Czy byłbyś bardziej konkretny? –

+0

Bardziej szczegółowe: Muszę być w stanie wysyłać zdarzenia między moich węzłów aplikacji. Jak już powiedziałem, mam bazę danych i magazyn plików współdzielony między węzłami, więc wolałbym użyć jednego z nich jako magistrali zdarzeń. –

+1

Hej andrew.z - byłoby dobrze, gdybyś mógł dodać ograniczenia do swojego pytania. Jeśli wiesz o spójności pamięci podręcznej, ale ją odrzuciłeś, powiedz nam dlaczego; jeśli nie chcesz używać UDP, powiedz nam. To oszczędza ludzi, którzy odpowiadają na twoje pytanie z pomysłami, które nie spełniają twoich wymagań. –

Odpowiedz

3

Istnieje wiele istniejących bibliotek i komponentów. Możesz google o cache coherence. Istnieją różne gotowe do użycia rozwiązania, pamięć podręczna Jboss, spójność Oracle, GridGain itp.

Jeśli chcesz napisać odręczny kod, istnieje niewiele sposobów, jak można to zrobić. Każdy węzeł w klastrze powinien wiedzieć o innym węźle (w najprostszym przypadku). Dane można replikować na różne sposoby.

Replikacja synchroniczna Zapis występuje w lokalnej pamięci podręcznej tylko podczas zapisywania do innych węzłów.

asynchronicznej replikacji. Zapis występuje w węźle lokalnym, a następnie replikowany na innych węzłach.

unieważnianie Cache. Po zmianie danych wszystkie węzły odbierają sygnał, unieważniają dane i ponownie odczytują je z bazy danych.

Może to być trudne do wykonania samodzielnie, potrzebujesz specjalnego protokołu (możesz użyć JGroups), którego twoje węzły użyją do wymiany danych. Proponuję znaleźć gotowe rozwiązanie

+0

Dzięki za wpis. Jestem świadomy spójności pamięci podręcznej, ale myślę, że to przesada dla tego, co muszę móc zrobić. Wszystko, czego potrzebuję, to po prostu móc wysyłać zdarzenia między moimi węzłami aplikacji, najlepiej korzystając z bazy danych lub udostępniając pliki jako autobus. –

+0

Wypróbuj jgroups. Może pomóc w rozgłaszaniu zdarzeń między węzłami. Łączenie udostępnionego źródła danych nie jest najlepszym rozwiązaniem. Zależnie od potrzeby oczywiście – Anton

+0

Jeśli jgroups może używać plików lub bazy danych zamiast UDP ... –

Powiązane problemy