Доставка из мультиплексированных каналов в Netty 5

Поскольку Netty Channel использует один поток как для входящей, так и для исходящей обработки, мне интересно узнать о рекомендуемой практике доставки входящих данных при использовании мультиплексированного протокола, такого как SPDY. Несколько вариантов, которые приходят на ум:

1) Доставить данные для всех потоков в приложение (т. е. неканальный код) с использованием потока канала. В этом случае доставка не требует дополнительного переключения контекста. Приложение должно уметь откладывать любую тяжелую работу на свои собственные потоки, чтобы быть «хорошим потребителем». Если этого не произойдет, это может эффективно заблокировать любую запись в канал на некоторое время (поскольку и чтение, и запись используют один и тот же поток).

2) Доставка с использованием отдельного исполнителя (опционально с привязкой потоков к потоку). В этом случае мы берем на себя переключение контекста на ранней стадии. Приложение, которое блокирует поток доставки, не будет блокировать конвейер Netty. Недостатком этого является то, что логика приложения в некоторых (возможно, во многих) случаях может быть довольно легкой и может не требовать переключения контекста.

3) Внедрить многопоточный EventLoop со сходством потоков для каждого потока. Это, однако, кажется, нарушает текущее предположение, что канал должен быть однопоточным. Я не уверен, что это жизнеспособно. Может быть, кто-то, кто больше разбирается во внутренностях Netty, может подтвердить?

Кто-нибудь знает о других соображениях или имеет дополнительные параметры, которые я пропустил?


person nmittler    schedule 05.06.2014    source источник


Ответы (1)


что вы можете сделать, так это поместить «логику приложения» (которая заблокирует поток ввода-вывода) в дополнительный ChannelHandler и добавить его в ChannelPipeline с помощью пользовательской группы EventExecutorGroup. Таким образом, обработка перемещается из EventLoop в EventExecutor, который предоставляется из EventExecutorGroup.

person Norman Maurer    schedule 06.06.2014
comment
Хорошо, это имеет смысл. Таким образом, кажется, что это, по сути, будет вариантом № 2. Я прав и думаю, что № 3 просто не будет работать в Netty 5.x? - person nmittler; 11.06.2014