Pytanie Pojedyncze lub wiele pul wątków dla serwera Java?


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.

Korzystam z 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 inne 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ć pojedynczą pulę wątków i uruchamiać wszystko na niej bez żadnej separacji.

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?


12
2017-09-17 08:07


pochodzenie


+1 ciekawe pytanie. - KLE


Odpowiedzi:


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

Na przykład obecnie piszę aplikację serwerową składającą się z kilku wysokowydajnych programów piszących i potencjalnie wielu czytelnikó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 a PriorityQueue w połączeniu z a ThreadPoolExecutor i nadaj wyższy priorytet, aby pisać żądania.

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.


6
2017-09-17 08:37





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

Twoje zadania Quartz mogą być wstrzymane, anulowane itd., Nazwijmy to "zarządzaneMyślę, że stworzysz interfejs do zarządzania nimi.

Czy zdajesz sobie sprawę, że twoje inne zadania ("na żądanie") nie będą korzystać z tych samych funkcji, chyba że je wdrożysz? Czy uważasz, że wszystko jest kwintesencją (nawet jeśli zaczyna się od razu), aby uzyskać jednolity kod?


0
2017-09-17 08:15



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. - Gregory Mostizky
@Gregory Rozumiem twoje obawy dotyczące numeru puli wątków. Nie mam żadnych zaleceń na ten temat :-( Co do niewygodnego kwarcu, dokładnie tak się czułem, kiedy z nim pracowałem !! :-) Zawarłem to w domową prostą metodę. - KLE
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