Singleton w środowisku klastra

Jaka jest najlepsza strategia refakturowania pojedynczego obiektu do środowiska klastrowego?

Używamy Singletona do buforowania niektórych niestandardowych informacji z bazy danych. Its głównie Tylko do odczytu, ale jest odświeżany, gdy wystąpi jakieś szczególne Zdarzenie.

Teraz nasza aplikacja musi być wdrożona w środowisku klastrowym. Z definicji, każdy JVM będzie miał własną instancję Singleton. Tak więc pamięć podręczna może być poza synchronizacją między JVM, gdy wystąpi zdarzenie odświeżania na pojedynczym węźle i jego pamięć podręczna jest odświeżona.

Jaki jest najlepszy sposób na synchronizację pamięci podręcznej?

Dzięki.

Edit: pamięć podręczna służy głównie do dostarczania listy autouzupełniania (powodów wydajności) do interfejsu użytkownika i używamy Websphere. Więc wszelkie wskazówki związane z Websphere mile widziane.

Author: Amro, 2009-07-28

9 answers

Najprostsze podejścia to:

  1. Dodaj timer wygaśnięcia do pamięci podręcznej singleton, aby co jakiś czas Pamięć podręczna była czyszczona, a wywołania podrzędne pobierały zaktualizowane dane ze źródła (np. bazy danych)

  2. Zaimplementuj mechanizm powiadomień dla pamięci podręcznej, używając czegoś w rodzaju JMS topic / tibRV. Uzyskaj każdą instancję pamięci podręcznej, aby subskrybować i reagować na wszelkie wiadomości o zmianach w tym temacie.

 9
Author: pjp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-28 13:54:30

Zastąp pamięć podręczną Singletona rozproszoną pamięcią podręczną.

Jednym z takich cache może być JBoss Infinispan ale jestem pewien, że istnieją inne rozproszone technologie cache i grid, w tym komercyjne, które są prawdopodobnie bardziej dojrzałe w tym momencie.

Dla obiektów singletonowych w ogóle nie jestem pewien. Myślę, że wolałbym nie mieć singletonów.

 16
Author: Chris Vest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-28 13:35:51

Możesz użyć DistributedMap , która jest wbudowana w WAS.

-Rick

 8
Author: Rick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-04 21:57:38

Lub coś w stylu memcached

Http://www.danga.com/memcached/

Co to jest memcached? memcached jest wydajna pamięć rozproszona object caching system, generic in natury, ale przeznaczone do stosowania w przyspieszenie dynamicznych aplikacji internetowych zmniejszając obciążenie bazy danych.

Danga Interactive opracował memcached aby zwiększyć szybkość LiveJournal.com, strona która była już robi 20 milionów+ dynamiczna strona odsłon dziennie dla 1 milionów użytkowników z Banda webserverów i Banda serwery baz danych. Memcached dropped Ładowanie bazy danych prawie do niczego, uzyskanie szybszego czasu ładowania strony dla użytkowników, lepsze wykorzystanie zasobów, i szybszy dostęp do baz danych na memcache miss.

 4
Author: monkey_p,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-28 13:55:42

Jeśli to możliwe, użyj do tego wsparcia serwera aplikacji, jeśli to możliwe (niektóre mają, niektóre nie). Na przykład, używamy wsparcia JBoss dla "Ha Singleton", który jest usługą, która działa tylko na węźle nadrzędnym klastra. Nie jest idealny (trzeba zająć się sprawą, gdzie czasami pierdzi mózg), ale jest wystarczająco dobry.

W przeciwnym razie możesz być w stanie zaprojektować coś za pomocą JGroups, który zapewnia automatyczne wykrywanie i negocjowanie węzłów klastra, ale to nietrywialne.

W ostateczności możesz użyć blokady bazy danych do zarządzania singletonami klastrów, ale to jest poważnie kruche. Nie zaleca się.

Jako alternatywę dla singletonu klastra, możesz użyć rozproszonej pamięci podręcznej. Polecam JBossCache (który nie potrzebuje serwera aplikacji JBoss do uruchomienia) lub EhCache (który teraz udostępnia mechanizm dystrybucji). Będziesz musiał ponownie zaprojektować swoją pamięć podręczną, aby działała w sposób rozproszony( nie będzie to magicznie tylko działać), ale to prawdopodobnie będzie to lepsze rozwiązanie niż klaster singleton.

 1
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-28 13:38:00

Jestem z Panem Vest Hansenem w tej sprawie, odsuń się jak najdalej od singletonów, jak tylko możesz. Po tym, jak zostałem nękany koszmarem, jakim jest SAAJ i JAXP i otrzymałem kompatybilne wersje działające na Jbossie, skończyłem z singletonami i fabrykami. Wiadomość mydła nie powinna potrzebować fabryki, aby ją utworzyć.

OK, a może memcache czy coś podobnego? Jakiego rodzaju powinowactwa potrzebujesz do swojej pamięci podręcznej? Czy jest źle, jeśli jest kiedyś nieaktualne, czy jest jakieś elastyczność w jaki sposób można uzyskać nieaktualne dane?

 1
Author: Chris K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-28 13:41:43

Istnieje kilka sposobów na rozwiązanie tego problemu, w zależności od tego, czy 1) Dane są niedostępne i czy każda instancja musi mieć te same wartości przez cały czas.

Jeśli potrzebujesz tylko danych, które są rozsądnie zgodne z danymi, ale każdy JVM nie musi mieć pasujących danych, możesz po prostu kazać każdemu JVM odświeżyć swoje dane w tym samym harmonogramie (np. co 30 sekund).

Jeśli odświeżanie ma nastąpić mniej więcej w tym samym czasie, jeden jvm może wysłać wiadomość do reszty z nich powiedzenie "its time to refresh now"

Jeśli każdy jvm zawsze potrzebuje tych samych informacji, musisz wykonać synchronizację, gdzie master mówi "odśwież teraz", wszystkie pamięci podręczne blokują wszelkie nowe zapytania, odświeżają i informują mistrza, że są gotowe. Gdy mistrz otrzymuje odpowiedź od każdego członka klastra, wysyła kolejną wiadomość, która mówi, aby kontynuować.

 1
Author: KeithB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-28 13:59:16

Mam do czynienia z podobną sytuacją, ale korzystam z Oracle WebLogic i Coherence .

Pracuję nad aplikacją internetową, która używa hashmap z buforowanymi danymi odczytywanymi z bazy danych (tekst do wyświetlenia na etykietach webform). Aby to osiągnąć, Programiści użyli instancji singleton, w której przechowywali wszystkie te informacje. To działało dobrze na pojedynczym środowisku serwerowym, ale teraz chcemy przejść do rozwiązania klastrowego i mam do czynienia z tym problemem singleton

Z tego, co do tej pory czytałem, jest to najlepsze rozwiązanie, aby osiągnąć to, czego chcę . Mam nadzieję, że to pomoże Ci z Twoim problemem.

 1
Author: XpiritO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-25 11:16:00

Istnieją produkty do dystrybucji w pamięci podręcznej (takie jak memcache), które mogą pomóc w tej sytuacji.

Lepszym rozwiązaniem, jeśli to możliwe, może być to, aby singletony nie były tak naprawdę pojedyncze, ale aby aplikacja tolerowała oddzielne instancje (powiedzmy, że wszystkie rozpoznają, kiedy trzeba je odświeżyć), ale nie to, że muszą być zsynchronizowane przez JVMs, co może zmienić pamięć podręczną w wąskie gardło.

 0
Author: Yishai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-28 13:59:43