2009-09-17 15 views
12

Piszę dość złożoną aplikację serwera Java, która ma znaczącą część przetwarzania w tle oprócz zwykłego przetwarzania żądanie-odpowiedź. Niektóre przetwarzanie w tle odbywa się w sposób podobny do crona przy użyciu frameworka Quartz. Inne zadania są bardziej pożądane - jeśli nowy klient się połączy, tworzy dodatkowe zadanie do jego aktualizacji raz na jakiś czas. Zadania crona można również zmieniać - niektóre wykonują monitorowanie aplikacji zewnętrznych, niektóre obliczają statystyki i tak dalej.Pojedyncze lub wiele pul wątków dla serwera Java?

Używam wielu pul wątków, aby uruchomić wszystkie te zadania z myślą, że podobne zadania będą współużytkować pulę wątków, ale różne zadania nie będą współdzielić. Na przykład zadania monitorowania nigdy nie będą uruchamiane w puli statystyk, a zadania statystyki nigdy nie będą uruchamiane w puli monitorów.

Z drugiej strony wiem, że niektórzy ludzie woleliby po prostu mieć pulę pojedynczej nici i uruchamiać wszystko na niej bez rozstania.

Zastanawiam się, co jest uważane za najlepszą praktykę w takim scenariuszu.

Jakie są plusy i minusy oddzielania puli wątków?

Czy to ma znaczenie?

+2

+1 interesujące pytanie. – KLE

Odpowiedz

0

To naprawdę nie jest bezpośrednia odpowiedź, ale kolejna propozycja :-(

zadaniach kwarcowego może być wstrzymane, anulowane i tak dalej, nazwijmy go „udało”. Myślę, że można stworzyć pewne ui zarządzać nimi.

czy zdajesz sobie sprawę, że twoje inne zadania („na żądanie”) nie będzie korzystać z tych samych funkcji, chyba że wdrożyć go oczywiście? czy rozważałeś produkcji wszystkiego pracę kwarcowy (nawet jeśli uruchamia się natychmiast), aby uzyskać jednolity kod?

+0

Właściwie to jedna z opcji. Są jednak dwie kwestie - jedna to to, że AFAIK Quartz zmusza do korzystania z puli pojedynczych wątków - podczas gdy moje osobiste preferencje to używanie wielu. Po drugie, Quartz API jest świetny z zadań typu cron, ale nieporęczny, gdy trzeba po prostu szybko uruchomić jakiś algorytm równolegle. –

+0

@Gregory Rozumiem twoje obawy dotyczące numeru puli wątków. Nie mam żadnych zaleceń na ten temat :-(O niewygodnym Quartz, dokładnie tak czułem, kiedy z nim pracowałem !! :-) Zawarłem to w domową prostą metodę. – KLE

+0

Szczerze mówiąc, mamy również problem z kwarcem na gromadzie. Zadanie rozpoczyna się w dowolnym miejscu, a nie na serwerze, który przetwarza żądanie.Myślę, że kwarc jest uruchamiany na pierwszym węźle, który jest w górze, i że inne węzły go nie uruchamiają. To prowadzi do kilku problemów ... – KLE

6

Odpowiedź zależy od tego, czy należy posegregować zasoby aplikacji między różnymi rodzajami działalności, czy też nie.

Na przykład obecnie piszę aplikację serwerową składającą się z kilku wysokowydajnych programów piszących i potencjalnie wielu czytników. Czytelnicy będą sporadycznie uzyskiwać dostęp do aplikacji, ale potencjalnie mogą żądać dużej ilości danych (tj. Długich żądań). Muszę upewnić się, że pisarze nigdy nie są głodzeni, więc wykorzystam dwie pule wątków w moim projekcie do czytania/pisania. Jeśli pula wątków czytnika zostanie chwilowo wyczerpana, pisarze nie będą mieli wpływu; tylko żądania odczytu będą opóźnione.

Alternatywą byłoby użycie PriorityQueue w połączeniu z ThreadPoolExecutor i przypisanie wyższego priorytetu do pisania żądań.

Podsumowując - Moja rada brzmi: Zacznij od jednej puli wątków i spraw, aby Twój projekt był bardziej złożony, jeśli istnieje ku temu konkretny powód.