本文作者:郝洪范 ,Dubbo-go Committer,京东资深研发工程师。

一、MQ Request Reply特性介绍

什么是 RPC 通信?

如上图所示,类似于本地调用,A 服务响应调用 B 服务的 helloworld 方法需要怎么做?首先,A 服务的 Client Sub 收到函数调用后,会将调用方法以及参数序列化。Client Sub 通过 socket 将消息发送到服务端。服务端 B 接收到请求后,会按照协议将 request body 进行反序列化,获取将要调用的函数名以及参数。服务端调用该函数并获取到返回结果,Server Stub 将结果进行序列化后通过 socket 发送到 Client Sub,由 Client Sub 按照协议将消息反序列化,得到最终结果。

而实际上 RPC 框架会比以上流程更加复杂,还需考虑服务重试、熔断、 backup、request、路由负载均衡等。

如何利用 MQ 进行 RPC 通信?原理很简单,用 MQ 作为通信管道,模拟全双工通信。

如图所示,客户端 A 想要调用服务端 B 的 helloworld 方法需要怎么做?首先,客户端会将函数名字以及参数进行序列化,发送到 MQ Broker。MQ消费者消费到该消息后,会调用本地函数 helloworld,获取到结果后再将结果发送到 MQ Broker,MQ Broker  按照某种约定将响应结果发送到之前请求的 client 上。

以上流程完全为模拟 TCP 通信流程。RocketMQ 4.6.0分支也开始支持此特性——Request Reply。

上图为 Request Reply 实现原理。

Producer 创建 RequestFutureTable,producer 发起函数调用时,会将函数调用发送到 Broker 同时将该请求记录发送到 RequestFutureTable 中。Consumer 收到消息后,会调用本地函数将结果序列化返回给 Broker,同时返回给 Broker 特定的 request reply topic,附带返回的还有 producer。Broker获取到这些信息后,主动将消息发送到之前请求的 producer 上,producer 收到消息后会从RequestFutureTable中核对是否存在此请求,然后整完成整个 RPC 过程。

MQ虽然能用来模拟RPC的全双工通信,但需要付出一定代价:

  • 使用MQ后,一次 TCP被拆解为四次,耗时增加,RPC 性能降低。
  • 消息从 producer 发送到 Broker 再发送到 consumer,增加了消息传递的复杂性。
  • MQ 会将消息落盘,进一步降低 RPC 的吞吐能力。
  • RPC 通信严重依赖 MQ 的运维能力,MQ 容易成为性能瓶颈。
  • MQ 稳定性的维护成本远比 RPC 复杂。

综合考虑,使用 MQ 进行 RPC 通信不适合对接口耗时非常敏感的场景,但是任何技术都有其合适的应用场景,MQ 进行 RPC 通信也有其独特的妙用。

比如可以让 RPC 运行在类似于消息总线中,便于所有消息在统一入口进行消息的落盘审计。利用 MQ 的重试特性,能够保证所有请求都不会丢失。同时所有请求都运转在RocketMQ 中,消息请求的安全性得到进一步提高。

以上特性使得 MQ RPC 通讯特别适合消息安全性审查严格的场景,比如金融和银行场景,此类场景对接口时延要求不高,但对请求的安全性要求特别高。比如微众银行就利用 RocketMQ 的 request reply 特性构建了整个金融产品的 RPC 框架。

二、Dubbo-go介绍

Dubbo-go 是一款高性能的 go 语言微服务 RPC 框架,目标是打造新一代微服务基础设施,实现 Bridging The Gap Between X And Go,即使得 Dubbo-go 能与任何框架进行通信。

Dubbo-go 的框架的优势有以下几点优势:

  • 开发者可以使用 Dubbo-go 框架轻松构建 RPC 服务
  • 可以体验 Dubbo-go 强大的服务治理能力与运维能力。
  • Dubbo-go 的生态也在丰富中,比如 pixiu 网关已经可以在生产环境中使用。
  • Dubbo-go 的社区活跃度非常高,只要提交 issue,马上会有人进行跟进。

Dubbo-go 由四部分组成,分别是registry(注册中心)、consumer(客户端)、provider(服务端)、Monitor(Dubbo-go 的控制面)。客户端发起请求时,会首先从 register 获取客服务端的服务列表,然后通过对应的负载均衡获取到服务端,两者建立起 socket 进行通信。

Dubbo-go生态正在不断快速发展中。目前,Dubbo-go 能与gRPC、Spring Cloud、Dubbo、Java 进行通信,同时沉淀了 Dubbo-go 网关项目等,已经有公司在实际生产中使用。

RocketMQ 社区与Dubbo-go 社区联合推出了新功能,让 Dubbo-go 通过 RocketMQ 进行 RPC 通信来扩展 Dubbo-go 的通信方式。利用 Dubbo-go 丰富的服务治理能力和 RocketMQ 稳定的 RPC 通信能力,两者强强联合,打造 RPC 通信新范式。

Dubbo-go 通过 RocketMQ 进行通信的流程如下:Dubbo-go client 利用 request reply 特性将消息发送的 RocketMQ 的 Broker。Dubboserver 消费到 RocketMQ 的消息后,同样利用 RocketMQ 的 request reply 特性将消息返回到 Broker。Broker 将消息推送到发送消息的 Dubbo client 上。整个流程与 MQ 进行 RPC 通信的一致。

Dubbo-go 服务注册流程如下:首先 RocketMQ Broker 会向 nameserver 注册 Broker、topic、queue等信息。Dubbo-go client 会从 nameserver 中拉取路由信息,Dubbo-go server 订阅 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 的通信能力已经开发完毕,正在测试中,很快能与大家见面。

基于 RocketMQ 的 Dubbo-go 通信新范式的更多相关文章

  1. 基于springboot构建dubbo的入门demo

    之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...

  2. 【分布式事务】基于RocketMQ搭建生产级消息集群?

    导读 目前很多互联网公司的系统都在朝着微服务化.分布式化系统的方向在演进,这带来了很多好处,也带来了一些棘手的问题,其中最棘手的莫过于数据一致性问题了.早期我们的软件功能都在一个进程中,数据的一致性可 ...

  3. 基于VC++的WinCE网口通信

    基于VC++的WinCE网口通信 WinCE下的网络编程与Windows下的非常类似,只是个别API函数有所不同.同样分为UDP和TCP两种,UDP就是无连接的通信,通过“用户数据报协议”(UDP)来 ...

  4. uSID:SRv6新范式

    摘要:本文介绍最新的SRv6创新uSID(Micro Segment).uSID兼容既有的SRv6框架,将极大地改变SRv6的设计.实现和部署方式,成为SRv6的新范式. 一.SRv6 101 Seg ...

  5. 基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

    本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践. 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调 ...

  6. 基于S7-PLCSIM Advanced搭建S7通信仿真环境

    写在前面: 之前有专门讲过一期如何搭建西门子PLC的S7通信仿真环境,感兴趣的可以点击查看:戳↓ 1.基于TIA搭建西门子PLC仿真环境及通信方案-联合出品 2.手把手教你搭建西门子PLC仿真环境 那 ...

  7. Spring Cloud 系列之 Dubbo RPC 通信

    Dubbo 介绍 官网:http://dubbo.apache.org/zh-cn/ Github:https://github.com/apache/dubbo 2018 年 2 月 15 日,阿里 ...

  8. 通过dubbo暴露接口调用方法,及基于zookeeper的dubbo涉及配置文件

    现在很流行的Dubbo很多朋友都听说过吧,最近我也在看这方面的东西,分享先我的心得笔记. 先说说我们团队要做的项目框架,很简单重在实现基于zookeeper的dubbo注册. 框架:springmvc ...

  9. 分布式事务之如何基于RocketMQ的事务消息特性实现分布式系统的最终一致性?

    导读 在之前的文章中我们介绍了如何基于RocketMQ搭建生产级消息集群,以及2PC.3PC和TCC等与分布式事务相关的基本概念(没有读过的读者详见

  10. 滴滴出行基于RocketMQ构建企业级消息队列服务的实践

    小结: 1. https://mp.weixin.qq.com/s/v6NM3UgX-qTI7yO1QPCJrw 滴滴出行基于RocketMQ构建企业级消息队列服务的实践 原创: 江海挺 阿里巴巴中间 ...

随机推荐

  1. 通过 Docker 部署 Mysql 8.0 主从模式

    文章转载自:http://www.mydlq.club/article/106/ 系统环境: Mysql 版本:8.0.23 Docker 版本:19.03.13 一.为什么需要 Mysql 主从复制 ...

  2. Elasticsearch集群管理之添加、删除节点

    1.问题抛出 1.1 新增节点问题 我的群集具有黄色运行状况,因为它只有一个节点,因此副本保持未分配状态,我想要添加一个节点,该怎么弄? 1.2 删除节点问题 假设集群中有5个节点,我必须在运行时删除 ...

  3. 在 CentOS8/RHEL8 中配置 Rsyslog 服务器

    Rsyslog 是一个自由开源的日志记录程序,在 CentOS 8 和 RHEL 8 系统上默认可用.它提供了一种从客户端节点到单个中央服务器的"集中日志"的简单有效的方法.日志集 ...

  4. docket打包镜像内部报错

    临时记录,后面再完善 对于前端docker一般不太熟悉,当我们想要打包镜像的时候会去找教程,我按着教程去打包一个使用KOA框架搭建的node服务. 这是一个 koa + ts + pm2的项目 结果出 ...

  5. httpd常用配置之虚拟主机

    httpd常用配置 目录 httpd常用配置 虚拟主机: 相同IP不同端口 不同IP相同端口 相同IP相同端口不同域名 切换使用MPM(编辑/etc/httpd/conf.modules.d/00-m ...

  6. 可观测性的常见用例|Techtarget

    [ 文章来源 ]https://www.techtarget.com/searchitoperations/tip/Common-use-cases-for-observability 这些可观测性用 ...

  7. window安装MySQL 5.5教程

    window安装MySQL 5.5教程 1.官网下载MySQL 5.5 下载地址:https://dev.mysql.com/downloads/mysql/5.5.html#downloads 2. ...

  8. pthread_mutex_t & pthread_cond_t 总结

    pthread_mutex_t & pthread_cond_t 总结 一.多线程并发 1.1 多线程并发引起的问题 我们先来看如下代码: #include <stdio.h> # ...

  9. sql面试50题------(11-20)

    文章目录 11.查询至少有一门课与学号为'01'的学生所学课程相同的学生的学号和姓名 12.查询和'01'号同学所学课程完全相同的其他同学的学号 13.查询两门及其以上不及格课程的同学的学号,姓名及其 ...

  10. 齐博x2模型里边钩子的创建与使用

    在模型里边的钩子创建与使用方法跟在控制器里边的钩子创建及使用方法是有所区别的在模型里边创建的钩子,你可以理解为执行一个函数,是无法调用模型里边的类的方法及属性的.比如系统文件\application\ ...