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 подключений!). Я хочу знать, как это происходит? Есть что-то, что я пропустил.

================ проблема решена =============

Пожалуйста, обратитесь к Scala: почему mapValues ​​создает представление и есть ли стабильные альтернативы? Метод MapValue карты может быть сложным

val resultIsAView = m.mapValue(mapFunction)

функция mapFunction будет пересматриваться каждый раз при просмотре результатов resultIsAView использоваться.

1 ответ

Решение

Можете ли вы подтвердить, что вы создали только один finagleClientи не один на каждый полученный вами запрос? (т.е. Thrift.newIface должно быть за пределами rpc метод).

Другая потенциальная причина, у вас может быть только один клиент, но otherRpc backend никогда не отвечает, поэтому ваш сервер создает новое соединение для каждого запроса (потому что предыдущий все еще "используется").

Другие вопросы по тегам