2012-02-18 14 views
7

Z jakich powodów można wybrać kilka procesów w kilku wątkach, aby zaimplementować aplikację w Javie?Kiedy wybrać kilka procesów nad wątkami w Javie?

Reorganizuję starszą aplikację java, która jest obecnie podzielona na kilka mniejszych aplikacji (procesów) działających na tej samej wielordzeniowej maszynie, komunikujących się między sobą za pośrednictwem gniazd.

Osobiście uważam, że powinno się to odbywać za pomocą wątków, a nie procesów, ale jakie argumenty bronią oryginalnego projektu?

Odpowiedz

9

I (i inni, patrz atrybucji poniżej) można myśleć o kilku powodów:

względów historycznych

  • projekt jest od czasów, kiedy tylko zielone nitki były dostępne i oryginalnych autor/projektant uznał, że nie będą dla niego pracować.

Solidność i Fault Tolerance

  • użyć składników, które nie są wątku bezpieczne, więc nie można parallelize withough uciekania się do wielu procesów.

  • Niektóre elementy są błędne i nie chcesz, aby mogły wpływać na więcej niż jeden proces. Powiedzmy, że jeśli komponent ma wyciek pamięci lub zasobów, co ostatecznie może wymusić ponowne uruchomienie procesu, wpływa to tylko na proces wykorzystujący komponent.

  • Prawidłowe wielowątkowość jest nadal trudne. W zależności od twojego projektu jest trudniejsze niż proces wieloprocesowy. Później jednak prawdopodobnie też nie jest to łatwe.

  • Możesz mieć model, w którym masz proces watchdog, który może aktywnie monitorować (i ewentualnie ponownie uruchomić) awarię procesów roboczych. Może to również obejmować zawieszenie/wznowienie procesów, co nie jest bezpieczne z wątkami (dzięki @Jayan za wskazanie).

Granice OS zasobów & Ład

  • Jeśli proces, za pomocą jednego wątku, już używa całej dostępnej przestrzeni adresowej (np dla aplikacji 32-bitowych w systemie Windows 2GB), ty może potrzebować rozpowszechniać pracę między procesami.

  • Ograniczenie wykorzystania zasobów (procesor, pamięć itp.) Jest zwykle możliwe tylko w przypadku pojedynczego procesu (na przykład w systemie Windows można tworzyć obiekty "zadania", które wymagają oddzielnego procesu).

Względy bezpieczeństwa

  • Można uruchomić różne procesy za pomocą różnych kont (czyli "Użytkownicy"), zapewniając w ten sposób lepszą izolację między nimi.

Zagadnienia kompatybilności

  • Pomoc stwardnienie/różne wersje Java: Korzystanie z procesów differnt można używać różnych wersji Java do części aplikacji (jeśli jest to wymagane przez biblioteki 3rd party).

Lokalizacja Przejrzystość

  • Mogłeś (potencjalnie) dystrybuować swoją aplikację na wielu maszynach fizycznych, co dodatkowo zwiększa skalowalność i/lub niezawodności aplikacji (patrz @Qwe's answer wiecej informacji/oryginalny pomysł).
+0

doskonała lista lub argumenty, dzięki! – wannabeartist

+0

+1 Obejmuje wszystko, co mógłbym wymienić. (Podkreślam elementy zarządzania zasobami i rozdzielania uprawnień, są to rzeczy, których nie możesz wykonywać bez oddzielnych procesów, ale czasami w tych dniach możesz wykroczyć poza oddzielne procesy.) –

+0

+1 Czy solidność uwzględnia "odporność na błędy "- Podobnie jak niektóre procesy uruchamiają i obserwują inne procesy (postgres robi coś takiego). – Jayan

6

Jeśli zdecydujesz się na wątki, ograniczysz aplikację do pracy na jednym komputerze. To rozwiązanie nie skaluje się (ani nie skaluje do pewnego stopnia) - zawsze są ograniczenia sprzętowe.

Różne procesy komunikujące się za pośrednictwem gniazd mogą być dystrybuowane między komputerami, dzięki czemu można dodać praktycznie nieograniczoną liczbę lub ich liczbę. To się lepiej skaluje kosztem powolnej komunikacji między procesami.

Decydowanie, które podejście jest bardziej odpowiednie, samo w sobie jest bardzo interesującym zadaniem. A kiedy podejmiesz decyzję, nie ma gwarancji, że za kilka lat będzie wyglądać głupio dla twoich następców, gdy zmienią się wymagania lub pojawi się nowy sprzęt.

+0

Bardzo prawdziwe. W tym przypadku aplikacja powinna być uruchamiana na pojedynczej maszynie zawsze, ale ogólnie jest to bardzo ważny punkt do rozważenia. – wannabeartist

Powiązane problemy