Netty 4 - EventLoopGroup - EventLoop - EventExecutor - Сближение темы

Я изучаю код Netty 4.0.0.Alpha5, чтобы узнать, как обрабатывается threading. Я также прочитал введение в новую модель Threading Netty 4 в http://netty.io/wiki/new-and-noteworthy-in-4.0.html#wiki-h2-34.

Как я понимаю, цели заключаются в следующем:

  • Связывание потоков, привяжите канал к одному потоку (EventLoop). Я предполагаю, что этот подход был предпринят для уменьшения промахов в кэше и улучшения ситуации на оборудовании NUMA.

Итак, мне интересно, правильна ли моя интерпретация или нет. И если я прав, то возникает следующий вопрос:

  • Наличие возможно длинного канала ChannelHandler (например, операции с базой данных) в ChannelPipeline может блокировать EventLoop (Thread) и поэтому блокирует все другие каналы, назначенные одному и тому же EventLoop (Thread). Является ли это толкование истинным?
  • Пытаясь избежать этой проблемы, я могу использовать EventExecutor для длинного канала ChannelHandler, но в соответствии с документацией (см. ссылку выше) канал снова привязан к одному потоку в своем EventExectuor и, следовательно, может снова блокировать другие Каналы, которые назначил ту же тему (внутри EventExecutor). Я что-то пропустил или это правда?

Я просто пытаюсь понять, почему все так и есть, и получить некоторую информацию о намерениях проекта Netty 4.

Ответы

Ответ 1

Верно оба вопроса. Назначив обработчик группе событий, отличной от I/O, вы можете предотвратить блокирование потока ввода-вывода за счет длительных операций, таких как доступ к базе данных. Вы можете указать EventExecutorGroup с большим размером в зависимости от того, что делает обработчик. Это не очень отличается от того, что делает обычный пул потоков. Если пул потоков занят, любая попытка выполнить долго выполняющуюся задачу будет поставлена ​​в очередь.

Ответ 2

Ваши две точки также верны с Netty 3.

Netty 3 имел концепцию босса и рабочих потоков. Поток босса отвечал за принятие новых подключений, которые он затем выгружал бы в рабочий поток. Количество рабочих потоков настраивалось при создании NioServerSocketChannelFactory.

Теперь Netty 4 заменил эти боссы и рабочие потоки соответственно родительским циклом событий и циклом дочерних событий. Но основная идея осталась прежней: чтобы избавиться от модели нить за соединение, вы должны выделить более одного соединения с потоком.
Поэтому, когда вы создаете сервер, будет установлен фиксированный пул из N потоков, предназначенных для обработки соединений. Если количество подключений ниже N, то в потоке не будет более одного соединения. С другой стороны, если у вас более N соединений, некоторые потоки будут управлять несколькими подключениями. Это делается круговым способом, проверьте MultithreadEventExecutorGroup.next()