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 никогда не отвечает, поэтому ваш сервер создает новое соединение для каждого запроса (потому что предыдущий все еще "используется").