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