Что происходит при достижении общего порога MemoryAwareThreadPoolExecutor? - PullRequest
0 голосов
/ 23 марта 2012

Что происходит с каналами, когда достигается канал или общее пороговое значение MemoryAwareThreadPoolExecutor? MemoryAwareThreadPoolExecutor устанавливается в ExecutionHandler, который находится на каждом конвейере до обработчика ввода-вывода.

Мое текущее состояние информации:

Я нашел: channel.setReadable(false) называется. Это означает, что все операции чтения на всех каналах остановлены, верно? То есть входящие данные не будут доставлены ни в один конвейер? Когда я понял все правильно, вы должны разделить свой код в конце конвейера на неблокирующий бизнес-обработчик и блокирующий бизнес-обработчик с обработчиком выполнения перед блокирующим. Пример: -> Декодер, Кодирование, NonBlockingHandler, ExecutionHandler, I-O-Handler

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

Я допускаю, что это не гарантирует выполнение сообщений в полученном порядке на канал. Но давайте просто предположим, что в этом нет необходимости.

С наилучшими пожеланиями и поздравлениями Нетти!

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

При достижении порогового значения для данного канала вызывается channel.setReadable (false), что предотвращает дальнейшее чтение с этого канала.Когда будет обработано достаточно данных, будет вызван channel.setReadable (true), позволяющий снова считывать данные.В то же время любые непрочитанные данные будут храниться в буферах сетевого стека ОС или архивироваться на хост-отправитель.

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

  1. Канал (или каналы) получает данные быстрее, чем может быть обработан
  2. Канал (или каналы)) очередь превышает общий пороговый предел, блокируя поток ввода-вывода
  3. Поток пула потоков записывает некоторые данные обратно в канал и ожидает его завершения.

Поток пула потоковникогда не освобождается, потому что поток ввода-вывода заблокирован, ожидая его возврата и, следовательно, не может обработать запрос на запись.

Еще одна вещь, если вы не ставите в очередь ChannelBuffers в пуле потоков, вам действительно нужно создать собственную реализациюObjectSizeEstimator для обеспечения того, чтобы пул потоков мог правильно управлять порогами.

1 голос
/ 23 марта 2012

Channel.setReadable (false) будет влиять только на канал, на котором он был назван, без других каналов.

...