0

我使用 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:为什么 mapValues 会产生一个视图,是否有任何稳定的替代方案?, Map 的 mapValue 方法可能比较棘手

val resultIsAView = m.mapValue(mapFunction)

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

4

1 回答 1

1

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

其他潜在原因,您可能只有一个客户端,但otherRpc后端从不响应,因此您的服务器为每个请求创建一个新连接(因为前一个仍在“使用中”)。

于 2015-01-30T00:02:53.657 回答