【问题】架构
Thrift采用了C/S模型,不支持双向通讯:client只能远程调用server端的RPC接口,但client端则没有RPC供server端调用,这意味着,client端可以主动与server端通讯,但server端不能主动与client端通讯而只能被动地对client端的请求做出应答。这种RPC模式在某些应用中存在缺陷,好比:有些应用,在大部分状况下,client端会主动向server端发请求或者向server端发送数据,而在少部分状况下,server端也须要主动向client发送一些命令,告知进行某些操做。异步
(什么是Thrift,可参考:Thrift架构介绍)socket
为了解决该问题,一般有三种方案可供选:.net
方案一:轮询(可选)server
该方案很容易想到:client端周期性地向server端询问是否须要进行某些操做,若是须要,则什么也不作,若是须要,则按照server的应答(response)要求进行操做。该方案的不足是延迟较大、且会浪费大量资源,形成没必要要的访问开销。blog
方案二:双client/server(推荐)接口
通讯双方都既是client,也是server。该方案须要在通讯双方之间创建两个通讯通道,开启两个端口,这比较繁琐,且很不优雅。但还是目前广泛采用的一套方案。资源
client/server <————————-> client/serverget
方案三:异步共享通道(不推荐)it
Thrit底层其实是socket,而socket是支持双向传输的,所以,咱们彻底能够经过修改thrift自己实现双向传输。有兴趣的读者可参考: