wake-up-neo.com

Wie funktioniert das Netty-Threading-Modell bei vielen Clientverbindungen?

Ich beabsichtige, Netty in einem bevorstehenden Projekt zu verwenden. Dieses Projekt fungiert sowohl als Client als auch als Server. Insbesondere werden viele Verbindungen zu verschiedenen Servern hergestellt und aufrechterhalten, während gleichzeitig die eigenen Clients bedient werden.

In der Dokumentation zu NioServerSocketChannelFactory wird das Threading-Modell für die Serverseite ziemlich genau angegeben. Jeder gebundene Listen-Port erfordert einen dedizierten boss -Thread, während verbundene Clients verarbeitet werden nicht blockierend auf worker threads. Insbesondere kann ein Arbeitsthread mehrere verbundene Clients verarbeiten.

Die Dokumentation zu NioClientSocketChannelFactory ist jedoch weniger spezifisch. Dies scheint auch beide boss und worker Threads zu nutzen. In der Dokumentation heißt es jedoch:

Eine NioClientSocketChannelFactory hat einen Boss-Thread. Es wird auf Anfrage ein Verbindungsversuch durchgeführt. Sobald ein Verbindungsversuch erfolgreich war, leitet der Boss-Thread den verbundenen Kanal an einen der Worker-Threads weiter, die die NioClientSocketChannelFactory verwaltet.

Worker-Threads funktionieren anscheinend genauso wie im Server-Fall.

Meine Frage ist, bedeutet dies, dass es für jede Verbindung von meinem Programm zu einem externen Server einen dedizierten boss thread gibt? Wie skaliert das, wenn ich Hunderte oder Tausende solcher Verbindungen herstelle?

Als Anmerkung. Gibt es nachteilige Nebenwirkungen bei der Wiederverwendung eines einzelnen Executors (zwischengespeicherten Threadpools) als bossExecutor und workerExecutor für eine ChannelFactory? Was ist mit der Wiederverwendung zwischen verschiedenen Client- und/oder Server-ChannelFactory-Instanzen? Dies wird hier etwas diskutiert , aber ich finde diese Antworten nicht spezifisch genug. Könnte jemand darauf näher eingehen?

24
Jiddo

Dies ist keine echte Antwort auf Ihre Frage zur Funktionsweise des Netty-Client-Thread-Modells. Sie können jedoch denselben NioClientSocketChannelFactoryverwenden, um einen einzelnen ClientBootstrapnamen__ mit mehreren ChannelPipelineFactorynamen__s zu erstellen und anschließend eine große Anzahl von Verbindungen herzustellen. Schauen Sie sich das folgende Beispiel an.

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

Es wird auch gezeigt, wie verschiedene Pipeline-Fabriken für verschiedene Verbindungen eingerichtet werden können. Je nach hergestellter Verbindung können Sie also Ihre Encoder/Decoder in der Kanal-Pipeline optimieren.

11
Abe

Ich bin nicht sicher, ob Ihre Frage beantwortet wurde. Hier ist meine Antwort: Es gibt einen einzelnen Boss-Thread, der alle ausstehenden CONNECTs in Ihrer App gleichzeitig verwaltet. Es verwendet nio, um alle aktuellen Verbindungen in einem einzigen (Boss-) Thread zu verarbeiten, und übergibt dann jeden erfolgreich verbundenen Kanal an einen der Worker.

1
jpayne

Ihre Frage betrifft hauptsächlich die Leistung. Einzelne Threads lassen sich auf dem Client sehr gut skalieren.

Oh, und Nabble wurde geschlossen. Dort können Sie das Archiv weiterhin durchsuchen.

0