Trop de TIME_WAIT connexions, “Ne peut pas assigner une adresse demandée”

J'ai une petite application web qui ouvre une connexion socket TCP, émet une commande, de lit la réponse, puis ferme la connexion pour chaque demande à un certain point de terminaison REST.

J'ai commencé les essais en charge le système d'extrémité à l'aide d'Apache JMeter et je suis en remarquant qu'après l'exécution pendant un certain temps, je commence à voir les erreurs du type "Impossible d'assigner une adresse demandée", le code d'ouverture de cette connexion est:

def lookup(word: String): Option[String] = {
 try {
  val socket = new Socket(InetAddress.getByName("localhost"), 2222)
  val out = new PrintStream(socket.getOutputStream)
  val reader = new BufferedReader(new InputStreamReader(socket.getInputStream, "utf8"))
  out.println("lookup " + word)
  out.flush()

  var curr = reader.readLine()
  var response = ""
  while (!curr.contains("SUCC") && !curr.contains("FAIL")) {
    response += curr + "\n"
    curr = reader.readLine()
  }
  socket.close()
  curr match {
    case code if code.contains(SUCCESS_CODE) => {
      Some(response)
    }
    case _ => None
  }
 }
 catch {
   case e: Exception => println("Got an exception "+ e.getMessage); None
 }
}

Quand je lance la commande netstat je vois aussi beaucoup de la suite de TIME_WAIT connexion statues, ce qui implique, pour moi, que je suis à court de ports dans l'espace éphémère.

tcp6       0      0 localhost:54646         localhost:2222          TIME_WAIT  
tcp6       0      0 localhost:54638         localhost:2222          TIME_WAIT  
tcp6       0      0 localhost:54790         localhost:2222          TIME_WAIT  
tcp6       0      0 localhost:54882         localhost:2222          TIME_WAIT 

Je me demande quelle solution est la meilleure pour cette question. Ma pensée est que la création d'un pool de connexion où les connexions à ce service qui s'exécute sur le port 2222 peuvent être réutilisés par les différentes requêtes HTTP, plutôt que de créer de nouvelles demandes à chaque fois. Est-ce un bon moyen de résoudre le problème et de faire la demande à l'échelle de mieux? Il semble comme beaucoup de frais généraux à introduire et certainement fait ma demande plus compliqué.

Existe-il d'autres solutions pour aider cette application à l'échelle et de surmonter ce port problème que je ne vois pas? Mon application web est en cours d'exécution dans une VM Ubuntu linux.

Avez-vous besoin d'SO_REUSE_ADDR? Voir la réponse ici: stackoverflow.com/questions/14388706/...
Aussi stackoverflow.com/questions/16014627/... et quelques millions d' 🙂 d'autres questions connexes - voir la liste sur le RHS ->

OriginalL'auteur jcm | 2014-09-24