Finagle 打开太多文件
Twitter Finagle open too many files
我使用Twitter-Finagle创建了一个服务器。在服务端的每一个RPC函数中,只需要使用一个Finagle客户端调用另一个服务端的RPC即可。像这样:
def rpc() = {
// finagleClient is created in a std way according to Finagle's Doc:
// val client = Thrift.newIface[Hello.FutureIface]("localhost:8080")
// http://twitter.github.io/finagle/guide/Protocols.html#thrift-and-scrooge
//
val f: Future[xx] = finagleClient.otherRpc()
f onSuccess { // do something }
f onFailure { // handle exception }
}
但是,时间不长,出现错误:
org.jboss.netty.channel.socket.nio.AbstractNioSelector: Failed to accept a connection
java.io.IOException: open too many files
而且,我使用 lsof -p
发现与另一台服务器的连接太多(大约 5000 个连接!)。我想知道它是怎么发生的?有什么我想念的吗?
================问题解决=============
请参考Scala: Why mapValues produces a view and is there any stable alternatives?,
Map 的 mapValue 方法可能有点棘手
val resultIsAView = m.mapValue(mapFunction)
每次使用结果视图 resultIsAView
时都会重新计算函数 mapFunction
。
您能否确认您只创建一个 finagleClient
,而不是为您收到的每个请求创建一个? (即 Thrift.newIface
应该在 rpc
方法之外)。
其他可能的原因,你可能只有一个客户端,但是otherRpc
后端从不响应,所以你的服务器为每个请求创建一个新连接(因为之前的仍然是"in use") .
我使用Twitter-Finagle创建了一个服务器。在服务端的每一个RPC函数中,只需要使用一个Finagle客户端调用另一个服务端的RPC即可。像这样:
def rpc() = {
// finagleClient is created in a std way according to Finagle's Doc:
// val client = Thrift.newIface[Hello.FutureIface]("localhost:8080")
// http://twitter.github.io/finagle/guide/Protocols.html#thrift-and-scrooge
//
val f: Future[xx] = finagleClient.otherRpc()
f onSuccess { // do something }
f onFailure { // handle exception }
}
但是,时间不长,出现错误:
org.jboss.netty.channel.socket.nio.AbstractNioSelector: Failed to accept a connection
java.io.IOException: open too many files
而且,我使用 lsof -p
发现与另一台服务器的连接太多(大约 5000 个连接!)。我想知道它是怎么发生的?有什么我想念的吗?
================问题解决=============
请参考Scala: Why mapValues produces a view and is there any stable alternatives?, Map 的 mapValue 方法可能有点棘手
val resultIsAView = m.mapValue(mapFunction)
每次使用结果视图 resultIsAView
时都会重新计算函数 mapFunction
。
您能否确认您只创建一个 finagleClient
,而不是为您收到的每个请求创建一个? (即 Thrift.newIface
应该在 rpc
方法之外)。
其他可能的原因,你可能只有一个客户端,但是otherRpc
后端从不响应,所以你的服务器为每个请求创建一个新连接(因为之前的仍然是"in use") .