2017-08-21 2 views
0

J'ai un client qui se connecte à n serveurs différents. Donc, je crée n canaux différents.
Parce que mes serveurs sont plus de 5000. J'utilise 10 boucles d'événements avec un seul groupe de boucles d'événements. En outre, il existe un pipeline distinct pour chaque canal.
Je sais déjà qu'il n'y aurait pas de problème de simultanéité si je vais utiliser une boucle d'événement et je n'ai pas encore vu de problème de concurrence sur 10 boucles d'événements.Ma question est:
Je vais avoir un problème de concurrence sur la ligne healthTargets.storeHealthyTarget(InetAddress.getByName(remoteAddress)); dans le ci-dessous morceau de code et pourquoi?
Je suppose qu'il y aura un problème de concurrence. Parce que si plusieurs boucles d'événements n'y accèdent pas, alors à quoi bon utiliser plusieurs boucles d'événements?Netty: Problèmes de simultanéité avec plusieurs boucles d'événements

@Override 
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws UnknownHostException { 
     if(channelHandlerContext.channel().remoteAddress() != null) 
     { 
      String remoteAddress = remoteAddress(channelHandlerContext.channel().remoteAddress().toString()); 
      if (httpObject instanceof HttpResponse) { 
       HttpResponseStatus responseStatus = ((HttpResponse)httpObject).getStatus(); 
       if (responseStatus.code() == HttpResponseStatus.OK.code()) 
       { 
        healthTargets.storeHealthyTarget(InetAddress.getByName(remoteAddress)); 
       } 
      } 
     } 
    } 

Ici healthTargets.storeHealthyTarget est juste en utilisant HashSet pour stocker l'ip et healthTargets est une classe singleton.

+0

Les bugs de threads sont des bogues qui se produisent généralement de façon sporadique, et ces bogues sont généralement difficiles à reproduire lorsqu'ils sont signalés, si vous suivez les règles de l'interface concernant les problèmes de threads, vous devriez être en sécurité – Ferrybig

Répondre

1

Si vous partagez la même instance du Set (ce que vous semblez faire) entre différents EventLoops, vous rencontrerez des problèmes. Cela est dû au fait que les différents canaux peuvent s'exécuter sur différents EventLoops et Threads. Cela a pour effet que vous devrez rendre l'accès de healthTargets thread-safe.

Ceci n'est différent d'aucun autre programme multithread.