Как работает модель потоков Netty в случае множества клиентских подключений? - PullRequest
27 голосов
/ 26 октября 2011

Я намерен использовать Netty в предстоящем проекте.Этот проект будет действовать как клиент и сервер.Особенно он будет устанавливать и поддерживать множество соединений с различными серверами, одновременно обслуживая своих клиентов.

Теперь документация для NioServerSocketChannelFactory достаточно точно определяет модель потоков для серверной стороны - каждому связанному порту прослушивания потребуется выделенный поток boss во всемпроцесс, в то время как подключенные клиенты будут обрабатываться неблокирующим образом в потоках worker .В частности, один рабочий поток сможет обрабатывать несколько подключенных клиентов.

Однако документация для NioClientSocketChannelFactory менее конкретна.Похоже, что здесь также используются потоки boss и worker .Тем не менее, в документации говорится:

Один NioClientSocketChannelFactory имеет один поток босса.Это делает попытку подключения по запросу.Как только попытка подключения завершается успешно, поток босса передает подключенный канал одному из рабочих потоков, которыми управляет NioClientSocketChannelFactory.

Рабочие потоки, кажется, работают так же, как и в случае сервера.

Мой вопрос: означает ли это, что для каждого соединения моей программы с внешним сервером будет выделен один boss поток?Как это будет масштабироваться, если я установлю сотни или тысячи таких связей?

В качестве примечания.Существуют ли какие-либо неблагоприятные побочные эффекты для повторного использования одного Executor (пула кэшированных потоков) в качестве bossExecutor и workerExecutor для ChannelFactory?А как насчет повторного использования между различными клиентскими и / или серверными экземплярами ChannelFactory? Это несколько обсуждается здесь , но я не нахожу эти ответы достаточно конкретными.Кто-нибудь может уточнить это?

Ответы [ 3 ]

13 голосов
/ 26 октября 2011

Это не реальный ответ на ваш вопрос о том, как работает модель потока клиента Netty.Но вы можете использовать один и тот же NioClientSocketChannelFactory для создания одного ClientBootstrap с несколькими ChannelPipelineFactory с и, в свою очередь, для создания большого количества соединений.Посмотрите на приведенный ниже пример.

public static void main(String[] args)
{
    String host = "localhost";
    int port = 8090;
    ChannelFactory factory = new NioClientSocketChannelFactory(Executors
            .newCachedThreadPool(), Executors.newCachedThreadPool());
    MyHandler handler1 = new MyHandler();
    PipelineFactory factory1 = new PipelineFactory(handler1);
    AnotherHandler handler2 = new AnotherHandler();
    PipelineFactory factory2 = new PipelineFactory(handler2);
    ClientBootstrap bootstrap = new ClientBootstrap(factory);
    // At client side option is tcpNoDelay and at server child.tcpNoDelay
    bootstrap.setOption("tcpNoDelay", true);
    bootstrap.setOption("keepAlive", true);
    for (int i = 1; i<=50;i++){
        if(i%2==0){
            bootstrap.setPipelineFactory(factory1);
        }else{
            bootstrap.setPipelineFactory(factory2);
        }

        ChannelFuture future = bootstrap.connect(new InetSocketAddress(host,
                port));

        future.addListener(new ChannelFutureListener()
        {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception
            {
                future.getChannel().write("SUCCESS");
            }
        });
    }
}

Также показано, как разные конвейерные фабрики могут быть установлены для разных соединений, поэтому, основываясь на соединении, которое вы делаете, вы можете настроить свои кодеры / декодеры в канальном конвейере.

1 голос
/ 18 января 2012

Я не уверен, что ваш вопрос был ответом.Вот мой ответ: есть единственный поток Boss, который управляет одновременно всеми ожидающими соединениями в вашем приложении.Он использует nio для обработки всех текущих подключений в одном потоке (Boss), а затем передает каждый успешно подключенный канал одному из рабочих.

0 голосов
/ 15 ноября 2011

Ваш вопрос в основном касается производительности. Отдельные потоки очень хорошо масштабируются на клиенте.

О, и клев был закрыт. Вы все еще можете просмотреть архив там.

...