2012-03-23 2 views
0

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

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

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

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

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

С наилучшими пожеланиями и приветствия Netty!

ответ

2

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

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

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

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

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

1

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

+0

спасибо! – Martin

Смежные вопросы