Jak działa Model Netty threading w przypadku wielu połączeń klienckich?

Zamierzam wykorzystać Netty w nadchodzącym projekcie. Ten projekt będzie działał zarówno jako klient, jak i serwer. Szczególnie będzie ustanawiać i utrzymywać wiele połączeń z różnymi serwerami, jednocześnie obsługując własnych klientów.

Teraz dokumentacja NioServerSocketChannelFactory dość dobrze określa model wątku po stronie serwera - każdy związany Port nasłuchu będzie wymagał dedykowanego wątku boss przez cały proces, podczas gdy połączone klienty będą obsługiwane w sposób nieblokujący w wątkach worker . W szczególności jeden wątek roboczy będzie mógł obsługiwać wielu połączonych klientów.

Jednak dokumentacja Niocliensocketchannelfactory jest mniej szczegółowa. Wydaje się również, że używa zarówno wątków boss, jak i worker. Jednak dokumentacja stwierdza:

Jeden Niocliensocketchannelfactory ma jeden wątek główny. Dokonuje próby połączenia na Prośba. Gdy próba połączenia się powiedzie, wątek boss przekazuje podłączony kanał do jednego z wątków roboczych, którymi zarządza Niocliensocketchannelfactory.

Wątki robocze działają tak samo jak w przypadku serwera.

Moje pytanie brzmi, czy to oznacza, że będzie jeden dedykowany wątek boss dla każdego połączenia z mojego programu do zewnętrznego serwera? Jak będzie to skalowane, jeśli nawiążę setki lub tysiące takich połączeń?

Na marginesie. Czy istnieją jakieś niekorzystne skutki uboczne ponownego użycia pojedynczego executora (buforowanej puli wątków), ponieważ zarówno bossExecutor, jak i działają na Xecutor dla ChannelFactory? A co z ponownym użyciem między różnymi instancjami klienta i/lub serwera ChannelFactory? jest to nieco omówione tutaj, ale nie znajduję tych odpowiedzi wystarczająco konkretnych. Czy ktoś mógłby to rozwinąć?

Author: Elliot Vargas, 2011-10-26

3 answers

To nie jest prawdziwa odpowiedź na twoje pytanie dotyczące działania modelu wątku klienta Netty. Ale możesz użyć tego samego NioClientSocketChannelFactory, aby utworzyć pojedyncze ClientBootstrap z wieloma ChannelPipelineFactory s, a z kolei wykonać dużą liczbę połączeń. Spójrz na poniższy przykład.

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");
            }
        });
    }
}

Pokazuje również, w jaki sposób można ustawić różne fabryki rurociągów dla różnych połączeń, więc na podstawie połączenia można dostosować kodery/dekodery w potoku kanałów.

 11
Author: Abe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-07 00:30:35

Nie jestem pewien, czy twoje pytanie było odpowiedzią. Oto moja odpowiedź: istnieje jeden wątek szefa, który zarządza jednocześnie wszystkimi oczekującymi połączeniami w Twojej aplikacji. Wykorzystuje nio do przetwarzania wszystkich bieżących połączeń w jednym wątku (Boss), a następnie przekazuje każdy pomyślnie podłączony kanał jednemu z pracowników.

 1
Author: jpayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-18 09:41:49

Twoje pytanie dotyczy głównie wydajności. Pojedyncze wątki skalują się bardzo dobrze na klienta.

Oh, I nabble został zamknięty. Nadal można tam przeglądać archiwum.

 0
Author: Dominic Cerisano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-15 18:30:29