Лимит одновременных запросов Twitter-Finagle

Я создаю комиссионный сервер, используя Finagle, как это

val server = Thrift.serveIface(bindAddr(), new MyService[Future] {
  def myRPCFuction() {}
})

Но я обнаружил, что максимальное количество одновременных запросов - пять (почему 5 - когда больше 5, сервер просто игнорирует излишние.) Я очень тщательно просматриваю документ Finagle ( http://twitter.github.io/finagle/guide/Protocols.html), но не найдете никаких подсказок для настройки max-request-limit. Как настроить максимальное количество одновременных запросов Finagle? Спасибо

1 ответ

Я решил эту проблему самостоятельно и делюсь ею здесь, чтобы помочь другим, кто может столкнуться с тем же делом. Поскольку я возвращаюсь к функции Thrift до и в Thrift, когда вы возвращаетесь из функции RPC, вы возвращаете значения обратно вызывающему клиенту. В то время как в Finagle только при использовании Future.value() Вы возвращаете значение клиенту. И когда вы используете Finagle, вы должны полностью использовать асинхронный способ, то есть вам лучше не спать или выполнять какой-либо другой RPC синхронно в функции RPC.

/*   THIS is  BAD */
val server = Thrift.serveIface(bindAddr(), new MyService[Future] {
  def myRPCFuction() {
      val rpcFuture = rpcClient.callOtherRpc() // call other rpc which return a future
      val result = Await.result(rpcFuture, TwitterDuration(rpcTimeoutSec()*1000, MILLISECONDS))
      Future.value(result)
  }
})
/* This is  GOOD */
val server = Thrift.serveIface(bindAddr(), new MyService[Future] {
  def myRPCFuction() {
      val rpcFuture = rpcClient.callOtherRpc() // call other rpc which return a future
      rpcFuture onSuccess { // do you job when success (you can return to client using Future.value) }
      rpcFuture onFailure { // do your job when fail   }
  }
})

Тогда можно получить удовлетворительный параллелизм. Надеюсь, что это помогает другим, у кого такая же проблема.

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