Лимит одновременных запросов 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 }
}
})
Тогда можно получить удовлетворительный параллелизм. Надеюсь, что это помогает другим, у кого такая же проблема.