我有一个小型的Web应用程序,它打开一个TCP套接字连接,发出一个命令,读取响应,然后关闭每个请求到特定REST端点的连接。
我已经开始使用Apache JMeter对端点进行负载测试,并注意到在运行一段时间后,我开始看到像“无法分配请求的地址”这样的错误,打开此连接的代码如下:
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
}
}
当我运行netstat时,我也看到了很多TIME_WAIT连接状态,这意味着我在临时端口空间中的端口已经用完。
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
我想知道解决这个问题的最佳方案是什么。我目前的想法是创建一个连接池,使运行在端口
2222
上的该服务的连接可以被不同的HTTP请求重复使用,而不是每次都创建新的请求。这种方式修复问题、使应用程序扩展更好可行吗?似乎引入了很多开销并且使我的应用程序更加复杂。除了以上的方法外,是否还有其他帮助应用程序扩展并克服这个端口问题的解决方案?我的Web应用程序运行在Ubuntu Linux虚拟机上。