本文作者:郝洪帆,Dubbo-goCommitter,京东高级研发工程师。一、MQRequestReply特性介绍什么是RPC通信?如上图所示,类似于本地调用,服务A响应调用服务B的helloworld方法需要做什么?首先,服务A的ClientSub接收到函数调用后,会将调用方法和参数序列化。ClientSub通过套接字向服务器发送消息。服务器B收到请求后,会根据协议对请求体进行反序列化,得到需要调用的函数名和参数。服务器调用该函数并获取返回结果。ServerStub将结果序列化,通过socket发送给ClientSub。ClientSub根据协议对消息进行反序列化得到最终的结果。其实RPC框架会比上面的流程复杂一些,需要考虑服务重试、断路器、备份、请求、路由负载均衡等。如何使用MQ进行RPC通信?原理很简单,用MQ作为通信通道,模拟全双工通信。如图,如果客户端A要调用服务器B的helloworld方法应该怎么办?首先,客户端将函数名和参数序列化,发送给MQBroker。MQ消费者消费消息后,会调用本地函数helloworld,获取结果后,将结果发送给MQBroker,MQBroker根据一定的约定,将响应结果发送给之前请求的客户端。以上过程完全模拟了TCP通信过程。RocketMQ4.6.0分支也开始支持这个特性——RequestReply。上图展示了RequestReply的实现原理。生产者创建RequestFutureTable。当producer发起函数调用时,会将函数调用发送给Broker,并将请求记录发送给RequestFutureTable。Consumer收到消息后,会调用本地函数将结果序列化返回给Broker,同时返回Broker特定的请求回复主题,同时返回producer。Broker获取信息后,主动将消息发送给之前请求的生产者。生产者收到消息后,会从RequestFutureTable中检查请求是否存在,然后完成整个RPC过程。虽然可以用MQ来模拟RPC全双工通信,但是需要付出一定的代价:使用MQ后,一个TCP被拆成四次,增加了时间消耗,降低了RPC性能。消息从生产者发送到代理再到消费者,增加了消息传递的复杂性。MQ会将消息发送到磁盘,进一步降低了RPC的吞吐量。RPC通信非常依赖MQ的运维能力,MQ很容易成为性能瓶颈。MQ稳定性的维护成本远比RPC复杂。综合考虑,使用MQ进行RPC通信并不适用于对接口耗时非常敏感的场景,但任何技术都有其适合的应用场景,MQ进行RPC通信也有其独特的魔力。比如RPC可以运行在消息总线上,这样所有的消息都可以在同一个入口进行审计。使用MQ的重试特性可以保证所有的请求都不会丢失。同时,所有的请求都运行在RocketMQ中,进一步提高了消息请求的安全性。以上特点使得MQRPC通信特别适用于消息安全审查严格的场景,比如金融、银行等场景。此类场景对接口时延要求不高,但对请求安全性要求特别高。例如,微众银行利用RocketMQ的请求回复特性,搭建了整个金融产品的RPC框架。二、Dubbo-go简介Dubbo-go是一个高性能的go语言微服务RPC框架。目标是打造新一代微服务基础设施,实现BridgingTheGapBetweenXAnd??Go,让Dubbo-go可以和任何框架一起使用进行通信。Dubbo-go框架的优势在于:开发者可以使用Dubbo-go框架轻松构建RPC服务,体验Dubbo-go强大的服务治理和运维能力。Dubbo-go的生态也在不断丰富。比如pixiu网关已经可以在生产环境中使用了。Dubbo-go的社区非常活跃,只要提交issue,马上就会有人跟进。Dubbo-go由四部分组成,分别是Registry(注册中心)、Consumer(客户端)、Provider(服务端)和Monitor(Dubbo-go的控制平面)。客户端发起请求时,首先从寄存器中获取客户端服务器的服务列表,然后通过相应的负载均衡获取服务器,两者建立套接字进行通信。Dubbo-go生态发展迅速。目前Dubbo-go可以与gRPC、SpringCloud、Dubbo、Java进行通信。同时沉淀了Dubbo-go网关项目等,部分公司已经在实际生产中使用。RocketMQ社区和Dubbo-go社区联合推出了一个新功能,让Dubbo-go可以通过RocketMQ进行RPC通信,扩展Dubbo-go的通信方式。利用Dubbo-go丰富的服务治理能力和RocketMQ稳定的RPC通信能力,两者的结合开创了RPC通信的新范式。Dubbo-go通过RocketMQ的通信过程如下:Dubbo-go客户端使用请求回复特性向??RocketMQBroker发送消息。Dubboserver在消费RocketMQ消息后,同样利用RocketMQ的请求回复特性将消息返回给Broker。Broker将消息推送给发送消息的Dubbo客户端。整个过程和MQ一致进行RPC通信。Dubbo-go服务注册流程如下:首先,RocketMQBroker会向nameserver注册Broker、topic、queue等信息。Dubbo-go客户端会从nameserver拉取路由信息,Dubbo-go服务端会订阅topic信息。Dubbo-go的通信协议目前支持Dubbo、Triple、gRPC、Rest。由于Dubbo-go需要使用RocketMQ进行通信,所以我们需要构建一个新的通信协议,该协议已经基本设计好让RocketMQ和Dubbo-go完美融合。整个序列化协议。Dubbo-go本身可以支持Python2、JSON、Protobuf和MsgPack。dubbo-go通过使用RocketMQ进行通信也可以支持以上四种序列化协议,但主要使用Protobuf,其他三种协议基本作为扩展使用。使用RocketMQ承载Dubbo-go的通信能力已经开发完成,正在测试中,我们很快就会与大家见面。
