Как обработать несколько абонентов для ChannelConfig.setAutoRead () на одном канале - PullRequest
0 голосов
/ 07 февраля 2020

В Netty мы можем позвонить ChannelConfig.setAutoRead(), чтобы запустить или остановить автоматическое чтение в Channel. Например, GlobalChannelTrafficShapingHandler будет вызывать setAutoRead(false) для периодической приостановки чтения, чтобы скорость чтения оставалась ниже заданной полосы пропускания.

Наше приложение Netty представляет собой прокси, который открывает два Channel s для каждого запроса (один для клиента и один для сервера ). Мы используем GlobalChannelTrafficShapingHandler для регулирования скорости чтения Channel сервера. Кроме того, мы создали CustomThrottlingHandler, который также ограничивает скорость чтения Channel сервера, используя нашу собственную политику.

Мы столкнулись с проблемами, когда оба ChannelHandler s настраивали сервер ChannelConfig s autoRead в соответствии с их собственной политикой. У GlobalChannelTrafficShapingHandler есть некоторый лог c, который пытается определить, когда другой абонент установил autoRead, но он не работает так, как нам нужно. Мы обошли проблему, установив пользовательский Attribute на сервере Channel, но это не элегантно.

В общем, когда несколько ChannelHandler s регулируют один и тот же Channel, я бы хотел использовать самую строгую политику регулирования среди всех регуляторов следующим образом:

  • Когда ChannelConfig.setAutoRead(false) вызывается любым ChannelHandler, установите AutoRead в false в базовом канале.
  • Когда ChannelConfig.setAutoRead(true) вызывается любым ChannelHandler, не следует сразу устанавливать базовую настройку AutoRead на true. Вместо этого каким-то образом запишите намерение из ChannelHandler (или, в более общем случае, вызывающего абонента), чтобы установить AutoRead в true. Когда все абоненты выразят свое намерение setAutoRead(true), только тогда мы сделаем вызов setAutoRead(true) на базовом Channel.

Я был бы признателен за некоторые идеи о том, как этого добиться. Спасибо!

...