Netty 4: высокие и низкие водяные знаки записи

Я работаю с Netty 4. Я вижу следующие параметры сервера Netty: WRITE_BUFFER_HIGH_WATER_MARK и WRITE_BUFFER_LOW_WATER_MARK.

На официальной странице Статьи по теме есть ссылка на Лучшие практики Netty (слайды с видео), Норман Маурер. Один из слайдов выглядит так:

ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024);
bootstrap.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024);   

и имеет это предисловие:

Установите вменяемые WRITE_BUFFER_HIGH_WATER_MARK и WRITE_BUFFER_LOW_WATER_MARK

Но что такое WRITE_BUFFER_HIGH_WATER_MARK и WRITE_BUFFER_LOW_WATER_MARK? И как сделать их нормальными?

Четкой информации не нашел. Спасибо за вашу помощь.


person DmitryKanunnikoff    schedule 13.08.2014    source источник


Ответы (2)


Немного информации о водяных знаках из этой статьи:

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

Обратите внимание: чтобы клиенты могли адаптироваться к скорости обработки вами задач (фактически к адаптации размера окна), не следует делать большой разрыв между высокими и низкими водяными знаками. С другой стороны, небольшой зазор означает, что вы будете слишком часто добавлять/удалять сокеты из цикла событий.

Для Netty это похоже на правду, потому что это JavaDoc для ChannelConfig говорит:

Если количество байтов в очереди в буфере записи превышает значение writeBufferHighWaterMark, Channel.isWritable() начнет возвращать false.

И для низкого водяного знака:

Как только количество байтов, поставленных в очередь в буфере записи, превысит максимальную отметку, а затем упадет ниже этого значения, Channel.isWritable() снова вернет значение true.

Насчет здравомыслия, думаю, вопрос относительный, зависит от информации, которую вы отправляете через канал и как часто. Нет строгих правил относительно того, какие значения вы должны определить для этих переменных. Так что, я думаю, вы должны найти свои собственные ценности на практике. Слайды показывают вам один из примеров для этого.

person Michael Zhavzharov    schedule 13.08.2014
comment
Спасибо за ваше время и помощь! Спасибо, Михаил. Вы мне действительно значительно прояснили данный вопрос. - person DmitryKanunnikoff; 13.08.2014
comment
Не за что. Не за что :) - person Michael Zhavzharov; 13.08.2014

WRITE_BUFFER_HIGH_WATER_MARK и WRITE_BUFFER_LOW_WATER_MARK

параметры и относительные методы в ChannelConfig устарели.

.option(ChannelOption.WRITE_BUFFER_WATER_MARK, новый WriteBufferWaterMark(1, 2))

вот как вы это делаете.

person Ivan    schedule 27.07.2016