web-dev-qa-db-fra.com

Comment fonctionne le modèle de thread Netty dans le cas de nombreuses connexions client?

J'ai l'intention d'utiliser Netty dans un projet à venir. Ce projet agira à la fois comme client et serveur. En particulier, il établira et maintiendra de nombreuses connexions vers différents serveurs tout en desservant ses propres clients.

Maintenant, la documentation de NioServerSocketChannelFactory assez spécifie assez bien le modèle de threading pour le côté serveur - chaque port d’écoute lié nécessite un thread boss tout au long du processus, tandis que les clients connectés sont gérés de manière non bloquante sur worker threads. Plus précisément, un thread de travail sera capable de gérer plusieurs clients connectés.

Cependant, la documentation de NioClientSocketChannelFactory est moins spécifique. Cela semble également utiliser les deux boss et worker threads. Cependant, la documentation indique:

Un NioClientSocketChannelFactory a un thread de patron. Il fait une tentative de connexion sur demande. Une fois la tentative de connexion réussie, le thread patron transfère le canal connecté à l'un des threads de travail gérés par NioClientSocketChannelFactory.

Les threads de travail semblent également fonctionner de la même manière que pour le serveur.

Ma question est la suivante: cela signifie-t-il qu'il y aura un thread boss dédié pour chaque connexion de mon programme à un serveur externe? Comment va cette échelle si j'établis des centaines, voire des milliers de telles connexions?

En note de côté. Existe-t-il des effets indésirables lors de la réutilisation d’un seul exécuteur (pool de threads mis en cache) en tant que bossExecutor et workerExecutor pour un compte ChannelFactory? Qu'en est-il de la réutilisation entre différentes instances ChannelFactory de clients et/ou de serveurs? Ceci est un peu discuté ici , mais je ne trouve pas ces réponses assez spécifiques. Quelqu'un pourrait-il élaborer à ce sujet?

24
Jiddo

Ce n'est pas une vraie réponse à votre question concernant le fonctionnement du modèle de thread client Netty. Mais vous pouvez utiliser la même NioClientSocketChannelFactory pour créer une seule ClientBootstrap avec plusieurs ChannelPipelineFactorys et ainsi établir un grand nombre de connexions. Regardez l'exemple ci-dessous.

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

Il montre également comment différentes usines de pipeline peuvent être définies pour différentes connexions. Vous pouvez donc, en fonction de la connexion que vous établissez, ajuster vos encodeurs/décodeurs dans le pipeline.

11
Abe

Je ne suis pas sûr que votre question ait été répondue. Voici ma réponse: il existe un seul thread Boss qui gère simultanément tous les CONNECT en attente dans votre application. Il utilise nio pour traiter toutes les connexions actuelles dans un seul thread (Boss), puis transmet chaque canal connecté avec succès à l’un des opérateurs.

1
jpayne

Votre question concerne principalement les performances. Les threads simples évoluent très bien sur le client. 

Oh, et Nabble a été fermé. Vous pouvez toujours parcourir les archives ici.

0
Dominic Cerisano