Сервер мультиплексирования Java NIO: я должен использовать рабочие потоки для обработки запросов - PullRequest
0 голосов
/ 09 января 2019

Должен ли я принимать соединения и отслеживать клиентов в потоке слушателя, а затем разрешать работникам обрабатывать запрос и отвечать клиенту, или я должен делать все в одном потоке?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Ни.

В идеале для сервера на базе NIO вы должны создать пул потоков, используя что-то вроде Executors.newFixedThreadPool(), которое вы будете использовать для выполнения всей обработки ваших запросов.

Но не следует назначать запросы конкретным потокам, потому что остальная часть вашей системы также должна быть асинхронной. Это означает, что когда обработчику запроса необходимо выполнить некоторую длительную работу ввода-вывода или аналогичную, вместо того, чтобы блокировать поток и ожидать его завершения, он запускает его асинхронно и организует обработку для продолжения после завершения работы, отправляя новую задача в пул потоков. Пока неизвестно, какой поток выполнит работу в этот момент, поэтому обработка запроса может быть распределена по многим потокам.

Обычно вы должны координировать асинхронную обработку, используя CompletableFuture так же, как Promise используется в узле. Посмотрите на мой ответ здесь, который пытается объяснить, как это сделать: отделенный дизайн для асинхронного http-запроса

0 голосов
/ 09 января 2019

Если ваша обработка запросов на 100% асинхронна, то есть вы никогда ничего не ждете во время обработки запросов и , когда вы работаете в одноядерной системе, тогда может быть немного лучше сделать все в та же нить.

Если у вас многоядерная система или вы ожидаете ввода-вывода во время обработки запроса, вам следует использовать вместо этого пул потоков.

...