Может ли Netty обрабатывать один конвейер с несколькими потоками?

#concurrency #netty #pipelining

#параллелизм #netty #конвейерная обработка

Вопрос:

У меня есть приложение Netty 4, которое получает сообщения с высокой пропускной способностью, используя одно сетевое соединение (или, если быть точным, одну группу многоадресной рассылки IP), поэтому обработка всех обработчиков каналов в конвейере в основном однопоточная.

Есть ли способ настроить Netty для распараллеливания обработки, чтобы использовалось более 1 ядра? Я имею в виду «шаблон конвейерной обработки» многопоточности, известный как синхронный параллелизм. Встроено ли что-то подобное — или мне придется реализовать это самому, вне конвейера Netty?

Ответ №1:

Вы можете добавить в конвейер разные обработчики с разными EventLoopGroup s. Таким образом, вы можете выполнять разгрузку в разные потоки. Тем не менее, вам, возможно, придется быть осторожным с точки зрения заказа (в зависимости от протокола).

Комментарии:

1. Спасибо, Норман. Не уверен в ваших предупреждениях относительно упорядочения. Вы хотите сказать, что сообщения могут приходить в другом порядке в конце конвейера? В этом случае, я думаю, я просто new NioEventLoopGroup(1) для каждого обработчика. Поскольку у меня есть только одно «соединение», это не должно повредить мне с точки зрения производительности, но это гарантирует, что элементы не смогут обогнать другие, верно? (Но я не знаю, является ли NioEventLoopGroup это правильной реализацией для специфичных для канала EventLoopGroup s …)

2. Возможно, какой-то потомок SingleThreadEventLoop был бы лучше — есть ли где-нибудь пример групп циклов событий, специфичных для обработчика, на которые я могу сослаться?