2014-02-20 4 views
0

У меня есть проблемы с netty.Netty обрабатывает сообщения только в одном потоке

Несколько лет назад я использовал smartfox server 1.6x, и это многопотоковая модель привела меня к обработке сообщений для моего соединения в разных потоках. И эта функция заставила меня написать некоторый код синхронизации потоков, чтобы все сообщения обрабатывались правильно.

Теперь я использую netty, так как это потрясающий и очень полезный продукт для моих целей.

Итак, я реализовал некоторую серверную логику. Мой тест был следующий

  • сервер добавлять сообщения в очередь, обрабатывает каждое сообщение и текущий поток спит в течение 3-х секундов
  • клиента спам около 10 сообщений в секунду

И я увидел, что перед первым сообщения (первая десятка) не обрабатываются (обычно около 30 секунд), второй пакет сообщений не обрабатывается в параллельном потоке.


Так основные вопросы:

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


Нетти конфигурации:

_boss = new NioEventLoopGroup(1); 
    _worker = new NioEventLoopGroup(8); 

    _bootstrap = new ServerBootstrap(); 
    _bootstrap.group(_boss, _worker) 
     .channel(NioServerSocketChannel.class) 
     .childHandler(new NettyChannelInitializer()) 
     .option(ChannelOption.SO_BACKLOG, 128) 
     .childOption(ChannelOption.SO_KEEPALIVE, true); 
    _bootstrap.bind(_port).sync(); 

NettyChannelInitializer:

private static final ExtentionHandler SharedExtentionHandler = new ExtentionHandler(); 
private static final EventExecutorGroup ExtentionEventThreadPool = new DefaultEventExecutorGroup(20); 

public void initChannel(SocketChannel channel) throws Exception 
{ 
    ChannelPipeline pipeline = channel.pipeline(); 
    pipeline.addLast(ExtentionEventThreadPool, "extention", SharedExtentionHandler); 
} 
+0

Netty использует повторное использование потоков, поскольку создание потоков является дорогостоящим. Это одна из причин, почему это быстро – mangusta

ответ

1

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

+0

Спасибо, Доверие, эта информация очень полезна для меня. –

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