2014-11-22 2 views
2

Я хотел бы использовать Java Netty для создания TCP-сервера для большого количества постоянных подключений от клиентов. Другими словами, изображение, в котором есть 1000 клиентских устройств, и все они создают и поддерживают постоянное соединение с TCP-сервером. Там будет разумный объем трафика (в основном текстовые строки), которые идут взад и вперед по каждому из этих постоянных соединений. Как определить максимальное количество потоков для использования в группах босса и рабочих групп для NioEventLoopGroup?Количество потоков для NioEventLoopGroup с постоянными соединениями

Я понимаю, что при создании соединения Netty создает объект SimpleChannelInboundHandler для обработки соединения. Когда соединение создается, вызывается метод handler channelActive и каждый раз, когда он получает новое сообщение от клиента, метод messageReceived получает вызов (или метод channelRead0 в Netty 4.0.24). Правильно ли я понимаю? Что произойдет, если у меня есть длинный код для запуска в messageReceived - мне нужно запустить этот код в еще одном потоке (java.util.Thread)? Что произойдет, если мой метод messageReceived блокирует что-то или занимает много времени? Это приводит к остановке Netty?

В основном мне нужно написать сервер сокетов TCP, который может обслуживать большое количество постоянных подключений как можно быстрее. Существует ли какое-либо руководство по количеству потоков для NioEventLoopGroup и о том, как использовать любые потоки внутри обработчика?

Любая помощь была бы принята с благодарностью.

ответ

5

Как определить максимальное количество потоков для использования в группах босса и рабочих групп для NioEventLoopGroup?

  • О Boss Thread, если вы говорите, что вам нужны постоянные соединения, нет смысла использовать множество потоков босса, потому что потоки босса ответственны за принятие новых соединений. Поэтому я бы использовал только один поток босса.
  • Количество рабочих потоков должно зависеть от ваших процессорных ядер.

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

Что произойдет, если у меня есть длинный код для запуска в messageReceived - мне нужно запустить этот код в еще одном потоке (java.util.Thread)?

  • Вам действительно нужно это сделать? Вероятно, вы должны думать о том, чтобы делать свою логику по-другому, если нет, то, вероятно, вам следует рассмотреть OIO с новым потоком для каждого соединения.

Что произойдет, если мой метод messageReceived блокирует что-то или занимает много времени?

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

Это приводит к тому, что Netty перестанет останавливаться?

  • Да, это так.
+0

Удивительный, спасибо! – Marc

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