Jakie wzorce projektowe są najbardziej wykorzystywane w tworzeniu aplikacji o wysokiej dostępności? [zamknięte]

Podobnie są wzorce projektowe, których należy unikać?

Author: McGovernTheory, 2009-05-02

8 answers

Zakładam, że piszesz aplikację typu serwer (zostawmy aplikacje internetowe na chwilę - są jakieś dobre rozwiązania z półki, które mogą tam pomóc, więc spójrzmy na "mam ten świetny nowy typ serwera, który mam napisać" , ale chcę, aby to był problem HA).

W implementacji serwerowej żądania od klientów są zwykle (w jakiejś formie) konwertowane na jakiś wzorzec typu zdarzenia lub polecenia, a następnie wykonywane w jednej lub kilku kolejkach.

Więc pierwszy problem - trzeba przechowywać zdarzenia/polecenia w sposób, który przetrwa w klastrze (np. gdy nowy węzeł przejmuje funkcję master, patrzy na następną komendę, która wymaga wykonania i zaczyna się).

Lets start with a single threaded server impl (the easy-and concepts still apply to multi-threaded but its got its own set of issues0. Gdy polecenie jest przetwarzane wymagają pewnego rodzaju przetwarzania transakcji.

Kolejnym problemem jest zarządzanie efektami ubocznymi i jak radzić sobie z awarią aktualne dowództwo ? Tam, gdzie to możliwe, postępuj z efektami ubocznymi w sposób transakcyjny, tak aby były one wszystkie lub nic. ie. jeśli polecenie zmienia zmienne stanu, ale zawiesza się w połowie wykonania, możliwość powrotu do "poprzedniego" stanu jest świetna. Pozwala to nowemu węzłowi głównemu na wznowienie awarii polecenia i ponowne jego uruchomienie. Dobrym sposobem jest rozbicie efektów ubocznych na mniejsze zadania, które można ponownie uruchomić na dowolnym węźle. ie. przechowuj główne zadania startowe i końcowe żądania, z wiele małych zadań, które obsługują powiedzieć tylko jeden efekt uboczny na zadanie.

Wprowadza to również inne problemy, które wpłyną na twój projekt. Te zmienne stanu niekoniecznie są aktualizacjami baz danych. Mogą to być Stany wspólne (powiedzmy skończona maszyna stanowa dla komponentu wewnętrznego), które muszą być również rozproszone w klastrze. Tak więc wzorzec zarządzania zmianami taki, że kod główny musi zobaczyć spójną wersję stanu, którego potrzebuje, a następnie zatwierdzić ten stan w całej klaster. Użycie jakiejś formy niezmiennej (przynajmniej z głównego wątku wykonującego aktualizację) przechowywania danych jest użyteczne. ie. wszystkie aktualizacje są skutecznie wykonywane na nowych kopiach, które muszą przejść przez jakiś mediator lub fasadę, która aktualizuje tylko lokalne kopie pamięci z aktualizacjami po aktualizacji w całym klastrze (lub minimalną liczbę członków w całym klastrze dla spójności danych).

Niektóre z tych problemów są również obecne w systemach master worker.

Również potrzebne dobry błąd zarządzanie wraz ze wzrostem liczby rzeczy, które mogą pójść nie tak przy aktualizacji stanu (ponieważ masz teraz zaangażowaną sieć).

Często używam wzorca stanu. Zamiast aktualizacji jednej linii, dla efektów ubocznych chcesz wysyłać żądania / odpowiedzi i używać FSM specyficznych dla konwersacji, aby śledzić postępy.

Kolejną kwestią jest reprezentacja punktów końcowych. ie. klient podłączony do węzła master musi być w stanie ponownie połączyć się z nowym węzłem master ,a następnie słuchać wyników? Czy po prostu anulować wszystkie oczekujące wyniki i pozwolić klientom ponownie przesłać ? Jeśli zezwalasz na przetwarzanie oczekujących żądań, potrzebny jest dobry sposób identyfikacji punktów końcowych (klientów) (np. jakiś identyfikator klienta w wyszukiwarce).

Potrzebne jest również czyszczenie kodu itp. (np. nie chcę, aby dane czekały na ponowne połączenie klienta, aby czekać w nieskończoność).

Używa się wielu kolejek. Wiele osób będzie więc używać magistrali komunikatów (JMS mówi o Javie) do wypychania zdarzeń w sposób transakcyjny.

Terakota (znowu dla java) rozwiązuje wiele z tego dla Ciebie - wystarczy zaktualizować pamięć - Terakota to twoja elewacja / mediator tutaj. Oni właśnie wstrzyknąć aspekty dla Ciebie.

Terakota (nie pracuję dla nich) - wprowadza pojęcie "super static" , więc dostajesz te klastrowe singletony, które są fajne, ale musisz tylko mieć świadomość, jak to wpłynie na przebieg testów i prac rozwojowych-np. użyj dużo kompozycji, zamiast dziedziczenia konkretnych implementacji dla dobrego ponownego użycia.

Dla WWW aplikacje-dobry serwer aplikacji może pomóc w replikacji zmiennych sesji i działa dobry load balancer. W niektórych przypadkach korzystanie z tego za pomocą REST (lub wybranej metody usługi internetowej) jest łatwym sposobem napisania usługi wielowątkowej. Ale będzie to miało wpływ na wydajność. Ponownie zależy od domeny problemu.

Serwery komunikatów (powiedzmy jms) są często używane do wprowadzenia luźnego sprzężenia między różnymi usługami. Z przyzwoitym serwerem wiadomości można zrobić wiele routingu msg (ponownie apache Wielbłąd lub podobny robi świetną robotę) tj. powiedzmy, że lepki konsument przeciwko klastrowi producentów jms itp. może to również umożliwić dobre przełączanie awaryjne. JMS queue ' s etc może zapewnić prosty sposób dystrybucji cmd w klastrze, niezależnie od master / slave. (ponownie zależy to od tego, czy robisz LOB lub piszesz serwer / produkt od zera).

(Jak będę miał czas później posprzątam, może wstawię więcej szczegółów w poprawnej gramatyce ortograficznej itp)

 10
Author: nso1,
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-05-02 16:04:50

Jednym z podejść do tworzenia niezawodnego oprogramowania jest crash-only software :

Crash-only software to oprogramowanie, które zawiesza się bezpiecznie i szybko odzyskuje. Jedynym sposobem, aby go zatrzymać, jest rozbicie go, a jedynym sposobem, aby go uruchomić, jest odzyskanie. System tylko w przypadku awarii składa się z komponentów tylko w przypadku awarii, które komunikują się z powtarzalnymi żądaniami; usterki są obsługiwane przez awarię i ponowne uruchomienie wadliwego komponentu oraz ponowną próbę wszelkich żądań, które przekroczyły czas. Powstały system jest często bardziej niezawodny i niezawodny, ponieważ odzyskiwanie po awarii jest pierwszorzędnym obywatelem w procesie rozwoju, a nie po myśli i nie potrzebujesz już dodatkowego kodu (i powiązanych interfejsów i błędów) do jawnego zamykania. Całe oprogramowanie powinno być w stanie bezpiecznie się zawiesić i szybko odzyskać, ale oprogramowanie tylko w przypadku awarii musi mieć te cechy, lub ich brak staje się szybko widoczny.

 5
Author: Esko Luontola,
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-05-02 13:07:45

Polecam przeczytać wypuścić go!Michael Nygard. Przedstawia on szereg anty-wzorców, które wpływają na systemy produkcyjne, oraz wzorców, które pomagają zapobiec jednemu błędnemu komponentowi z usunięciem całego systemu. Książka obejmuje trzy główne obszary: stabilność, pojemność i ogólny projekt (obejmujący sieci, bezpieczeństwo, dostępność i administrację).

Moje poprzednie miejsce pracy zostało ugryzione (w takim czy innym czasie) przez prawie każdy scenariusz awarii Nygard kontury (z utratą przychodów za każdą powstałą awarię). Implementacja niektórych technik i wzorców, które sugeruje, zaowocowała znacznie bardziej stabilnymi i przewidywalnymi systemami (i tak, książka jest trochę Java centric, ale zasady mają zastosowanie w wielu kontekstach).

 4
Author: Pierce Hickey,
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-05-02 14:03:52

Źle:

...i będzie serwer pamięci

Dobre:

...i będzie gospodarstwo (wielokrotnego) przechowywania serwery z (wieloma) równoważnikami obciążenia z przodu of them

  • Umieść balansery obciążenia przed wszystkim. Na razie możesz mieć 4 backendy, ale w przyszłości możesz mieć ich 400, więc mądrze jest zarządzać nim tylko na LB, a nie wszystkie aplikacje, które używają backendu.

  • Użyj wielu poziomów cache.

  • Poszukaj popularnych rozwiązań na temat przyspieszania thigów (na przykład memcached).

  • Jeśli zamierzasz odnowić system, zrób to część po części, w wielu małych krokach. Jeśli zrobisz to jednym dużym krokiem (wyłącz Stary, włącz nowy i módl się, że zadziała) najprawdopodobniej się nie powiedzie.

  • Użyj nazw DNS dla rzeczy, np. storage-lb.servicename rozwiązuje adresy wszystkich nośników pamięci. Jeśli chcesz go dodać, po prostu zmodyfikuj dns, wszystkie usługi zaczną z niego korzystać automatycznie.

  • To Proste. Im więcej systemów zależy od Ciebie, tym bardziej ucierpi na tym Twoja usługa.

 2
Author: Paweł Polewicz,
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-05-02 12:47:56

Projektowanie systemów wysokiej dostępności (HA) jest aktywnym obszarem badań i rozwoju. Jeśli spojrzeć na ACM lub IEEE, istnieje mnóstwo prac badawczych na temat jakości usług (dostępność, niezawodność, skalowalność itp.) i jak je osiągnąć (luźne sprzężenie, adaptacja itp.). Jeśli szukasz bardziej praktycznych zastosowań, spójrz na systemy odporne na błędy i oprogramowanie pośrednie, które jest zbudowane tak, aby umożliwić tworzenie klastrów, siatkę lub działanie w chmurze.

Replikacja i obciążenie równoważenie (inaczej reverse proxy) są jednymi z najczęstszych wzorców osiągania systemów HA i często można to zrobić bez wprowadzania zmian w kodzie bazowego oprogramowania, zakładając, że nie jest zbyt ściśle powiązane. Nawet wiele z najnowszych rozwiązań chmurowych uzyskuje się głównie dzięki replikacji i równoważeniu obciążenia, chociaż mają one tendencję do elastyczności, aby sprostać szerokim zakresom zapotrzebowania na system.

Uczynienie komponentów oprogramowania bezpaństwowym zmniejsza ciężar replikacji, ponieważ stan sam nie musi być replikowany wraz z komponentami oprogramowania. Bezpaństwowość jest jednym z głównych powodów, dla których http skaluje się tak dobrze, ale często wymaga od aplikacji dodawania własnego stanu (np. sesji), który następnie musi być replikowany.

Dlatego łatwiej jest uczynić luźno sprzężone systemy wysoce dostępnymi niż systemy ściśle sprzężone. Ponieważ niezawodność komponentów systemu determinuje ogólną niezawodność systemu, elementy, które są niewiarygodne, mogą wymagać być zastąpione (awarie sprzętu, błędy oprogramowania, itp). Umożliwienie dynamicznej adaptacji w czasie wykonywania pozwala na wymianę tych uszkodzonych komponentów bez wpływu na dostępność całego systemu. Luźne sprzężenie jest kolejnym powodem stosowania niezawodnych systemów przesyłania wiadomości, w których nadawca i odbiorca nie muszą być dostępne w tym samym czasie, ale sam system jest nadal dostępny.

 2
Author: David Schlosnagle,
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-05-02 14:36:53

Z tego co rozumiem, szukasz konkretnych wzorców do wykorzystania w aplikacjach java będących częścią architektury HA. Oczywiście istnieje wiele wzorców i najlepszych praktyk, które można wykorzystać, ale nie są to tak naprawdę wzorce HA. Są to raczej dobre pomysły, które można wykorzystać w wielu kontekstach.

Myślę, że próbuję powiedzieć, że architektura wysokiej dostępności składa się z wielu małych części. Jeśli wybierzemy jedną z tych małych części i zbadamy je, prawdopodobnie okazało się, że nie ma magicznych atrybutów HA dla tego małego komponentu. Jeśli zbadamy wszystkie pozostałe komponenty, znajdziemy to samo. To kiedy są one połączone w inteligentny sposób thay stają się HA aplikacji.

Aplikacja HA to aplikacja, w której od początku planujesz najgorsze. Jeśli kiedykolwiek myślisz w kategoriach "ten komponent jest tak stabilny, że nie potrzebujemy do niego dodatkowej redundancji", prawdopodobnie nie jest to architektura HA. W końcu łatwo jest poradź sobie ze scenariuszami problemów, które przewidujesz. To ten, który cię zaskakuje, obniża system.

Mimo wszystko istnieją wzorce, które są szczególnie przydatne w kontekstach HA. Wiele z nich zostało udokumentowanych w klasycznej książce "Patterns of Enterprise Application Architecture" autorstwa Martina Fowlera.

 1
Author: Emil H,
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-05-02 13:13:52

Tłumaczę "Wysoka dostępność" jako "Zero przestojów"`, które można zaimplementować zgodnie z innym pytaniem SE:

Zero przestojów dla aplikacji Java

  1. przełącznik A/B: (Rolling upgrade + Fallback mechanism)
  2. równoległe wdrażanie - Apache Tomcat: (tylko dla aplikacji internetowych)
  3. opóźnione Wiązanie portów
  4. zaawansowane Wiązanie portów

Użyję niektórych z tych pojęć, aby przyjść up z wzorców projektowych dla systemu wysokiej dostępności z punktu widzenia oprogramowania, który uzupełnia powyższe podejścia.

wzory do użycia:

Proxy/Fabryka :

Mieć obiekt proxy, a proxy zdecyduje, gdzie przekierować żądania. Załóżmy, że masz wersję 1 i wersję 2 oprogramowania. Jeśli klienci łączą się ze starym protokołem, przekieruj ich do wersji 1 oprogramowania. Nowi klienci mogą łączyć się bezpośrednio z wersją 2. Proxy może mieć metodę fabryczną lub AbstractFactory do renderowania nowej wersji oprogramowania.

Strategia

Możesz zmienić algorytm w czasie wykonywania, wybierając jeden algorytm z rodziny algorytmów. Jeśli weźmiesz przykład z linii lotniczych, możesz przełączać się między algorytmami DiscountFare i NormalFare w miesiącach innych niż szczytowe i szczytowe natężenie ruchu.

Dekorator :

Można zmienić zachowanie obiektu w czasie wykonywania. Dodaj nową klasę i udekoruj dodatkowe odpowiedzialność.

Adapter :

Przydatne przy zmianie interfejsu lub umowy pomiędzy wersją 1 A wersją 2. Adapter odpowiednio zareaguje na Stare i nowe żądania klientów.

Ogólne wytyczne:

  1. luźne sprzężenie między obiektami
  2. przestrzegaj zasad S. O. L. I. D w aplikacji

Zobacz sourcemaking artykuły na stronie dla powyższych szablonów dla lepszego zrozumienie.

czego nie używać:

Oprócz wzorców projektowych, trzeba podjąć pewne środki ostrożności, aby osiągnąć zero przestojów dla aplikacji.

  1. nie wprowadzaj pojedynczego punktu awarii w swoim systemie.
  2. używaj rozproszonych pamięci podręcznych(np. Terakota) /zamków oszczędnie.
  3. Usuń twarde sprzężenie między usługami. Usuń ciasne sprzężenie między usługami za pomocą magistrali komunikacyjnej/ frameworków (JMS, ActiveMQ itp.)
 1
Author: Ravindra babu,
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
2017-05-23 10:31:34

Wysoka dostępność to bardziej dostępność sprzętu i nadmiarowość niż konwencje kodowania. Jest kilka wzorców, których użyłbym w prawie każdym przypadku HA: wybrałbym singleton patterndla mojego obiektu bazy danych i użył factory pattern do utworzenia Singletona. Fabryka może wtedy mieć logikę obsługi problemów z dostępnością w bazie danych (gdzie występuje większość problemów z dostępnością). Na przykład, jeśli Master jest wyłączony, to podłącz do drugi Mistrz zarówno czyta, jak i pisze, dopóki mistrz nie wróci. Nie wiem, czy są to najbardziej lewarowane wzorce, ale są najbardziej lewarowane w moim kodzie.

Oczywiście ta logika może być obsługiwana w metodzie _ _ construct, ale wzorzec fabryczny pozwoli Ci lepiej kontrolować kod i logikę decyzyjną, jak radzić sobie z problemami z łącznością bazy danych. Fabryka pozwoli również lepiej obsługiwać wzór Singletona.

Absolutnie uniknąłbym wzór dekoratora, oraz wzór obserwatora. Oba tworzą złożoność kodu, która utrudnia jego utrzymanie. Są to przypadki, w których są to najlepszy wybór dla Twoich potrzeb, ale w większości przypadków nie są.

 -6
Author: mylesmg,
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-11-04 21:30:35