Netty нарушена многопоточность в версии 4.1? Невозможно обработать короткие запросы после длинных? - PullRequest
0 голосов
/ 16 января 2020

Я просто хочу настроить очень распространенный сервер: он должен принимать соединения и делать бизнес-расчеты, чтобы получить ответ. Вычисления могут быть короткими или длинными -> Мне нужен какой-то ThreadPoolExecutor для выполнения этих вычислений.

В netty 3, который мы использовали долгое время, это было достигнуто очень легко, просто используя ExecutionHandler в конвейер, до моего BusinessHandler.

Но теперь, пытаясь настроить то же самое в Netty 4, я прочитал в документации, что ExecutionHandler больше не существует, и что я добавляю, чтобы указать EventExecutor при добавлении моего BusinessHandler в конвейер канала.

DefaultEventExecutorGroup applicativeExecutorGroup = new DefaultEventExecutorGroup(10);
...
ch.pipeline().addLast(applicativeExecutorGroup, businessHandler);

Работает для очень простого c scenar ios (только короткие запросы), но не в следующем. Причина в том, что DefaultEventExecutorGroup не выберет свободного работника, но любой, основанный на циклическом переборе.

  • Приходит первый запрос (R1), ему назначается T1 (поток 1 из группы DefaultEventExecutorGroup) и займет много времени (скажем, 1 минута).
  • Затем будет получено несколько других запросов Ri (i = от 2 до 10). Им назначается Ti, и они также успешно обрабатываются.
  • Но когда наступает R11, ему снова назначается T1 из-за алгоритма циклического перебора, реализованного в DefaultEventExecutorGroup, и запрос ставится в очередь после длинного R1. В результате он не начнет свою обработку раньше чем через одну минуту, и это явно недопустимая задержка. В конкретном сценарии ios клиенты никогда не получают ответ, потому что они ожидают ответа, прежде чем мы начнем обработку.
  • И так далее. Один запрос на каждые 10 запросов будет просто сбой, потому что ставится в очередь после длинного в единственном занятом потоке, в то время как все остальные потоки группы просто простаивают.

Есть ли другая конфигурация моего конвейера, которая должно сработать ? Например, существует ли реализация EventExecutor, которая бы работала как стандартный Executor (выберите БЕСПЛАТНОГО работника). Или это просто ошибка в netty 4.1? Это выглядело бы очень странно, поскольку это выглядит как очень распространенный сценарий для любого сервера.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 16 января 2020

Из того, что вы объяснили выше, я думаю, вы хотите использовать UnorderedThreadPoolEventExecutor вместо DefaultEventExecutorGroup. Или, если заказ важен NonStickyEventExecutorGroup.

...