Twitter Finagle打开了太多文件

时间:2015-01-29 11:37:49

标签: scala rpc finagle twitter-finagle

我使用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个连接!)。我想知道它是怎么发生的?有什么我错过了。

================问题解决=============

plz参考Scala: Why mapValues produces a view and is there any stable alternatives?, Map的mapValue方法可能很棘手

val resultIsAView = m.mapValue(mapFunction)

每次使用结果视图mapFunction时,都会重新评估函数resultIsAView

1 个答案:

答案 0 :(得分:1)

您能否确认只创建一个finagleClient,而不是每个请求都创建一个Thrift.newIface? (即rpc应在otherRpc方法之外。

其他潜在原因,您可能只有一个客户端,但{{1}}后端永远不会响应,因此您的服务器会为每个请求创建一个新连接(因为前一个请求仍在"正在使用&#34 ;)