我自己解决了这个问题,我在这里分享它以帮助可能遇到相同情况的其他人。因为我在 Thrift 之前和在 Thrift 中使用 thrift 用户,所以当您从 RPC 函数返回时,您会将值返回给调用客户端。在 Finagle 中,仅当您使用时才Future.value()
将值返回给客户端。而在使用Finagle的时候,应该完全使用异步的方式,也就是说最好不要在RPC函数中sleep或者做一些其他的同步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 }
}
})
那么,就可以得到满意的并发了。希望它可以帮助其他有同样问题的人。