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? И как заставить их быть здравомыслящими?

Я не нашел четкой информации. Благодарим за помощь.

Ответ 1

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

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

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

Для Netty это кажется правдой, потому что this JavaDoc для ChannelConfig говорит:

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

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

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

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

Ответ 2

WRITE_BUFFER_HIGH_WATER_MARK и WRITE_BUFFER_LOW_WATER_MARK

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

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

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