Netty: обратное распространение давления в трубопроводе обработчика канала для замедления отправителя - PullRequest
0 голосов
/ 23 ноября 2018

Я использую netty для разработки приложения, которое будет прослушивать определенный порт через TCP.После получения байтов у меня есть конвейер с бизнес-логикой для работы с полученными байтами.Этот конвейер состоит из нескольких обработчиков каналов, таких как декодер заголовка, обработчик фрагментации на уровне приложения и т. Д. В конце конвейера после обработки сообщения последний обработчик в конвейере (скажем, BufferWriter) помещает обработанное сообщение в очередь блокировки.Эта очередь блокировки действует как буфер, а BufferWriter действует как производитель.Обратите внимание, что эта очередь блокировки является общей для всех каналов.Таким образом, все данные, полученные приложением, будут записаны в одну очередь.Есть еще одна запланированная служба исполнителя, которая будет работать как потребитель этого буфера.Этот потребитель является периодическим заданием, которое запускается через определенный промежуток времени и принимает сообщение из буфера и записывает в файл.

Проблема, с которой я столкнулся, заключается в том, что при большом количестве входящего трафика мой поток потребителя не можетподдерживать темп.В результате чего очередь буфера заполняется.

В netty, есть ли способ замедлить скорость чтения из сокета, чтобы потребитель не отставал от производителя?Примерно так: когда буфер заполнится, netty не будет читать из сокета, и всякий раз, когда в буфере будет свободное место, он будет возобновлять чтение из сокета.

Обратите внимание, что в этом случае отправитель не записывается в java /Нетти.Это c программа, которая сформирует TCP соединение с моим сервером и начнет отправку данных.Я предполагаю, что, когда я замедляю скорость чтения моего сокета сервера, TCP будет автоматически замедлять отправителя, используя политику контроля перегрузки (медленный запуск)

1 Ответ

0 голосов
/ 23 ноября 2018

Для контроля чтения есть конфигурация с именем autoRead в Channel.Вы можете установить значение false:

ctx.channel().config().setAutoRead(false);

Если вы сделаете это, вам нужно вручную запустить чтение с канала:

ctx.channel().read();

Вы можете замедлить скорость чтения, первоначально установив autoRead в ложь, затем наличие буфера / счетчика в конце чтения (входящего) и чтение только когда буфер пуст до его заполнения.

При транспортировке WSO2 это делается так же, как в здесь с использованием слушателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...