2015-01-12 5 views
1

создать сервер бережливость, используя надувать как этотодновременных запросов предел Twitter-надувать

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

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

ответ

2

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

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