产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

腾讯宣布开源 RoP:Apache Pulsar 支持原生 RocketMQ 协议

  • 2021-05-17
  • 本文字数:2657 字

    阅读完需:约 9 分钟

腾讯宣布开源 RoP:Apache Pulsar 支持原生 RocketMQ 协议

RocketMQ 用户可以无缝迁移到 Apache Pulsar 了。自此,Apache Pulsar 补齐了兼容主流消息队列协议的能力。


我们很高兴地宣布腾讯云中间件开源 RoP!RoP 将 RocketMQ 协议处理插件引入 Pulsar broker,这样 Pulsar 就能支持原生 RocketMQ 协议了。本次 RoP 开源,感谢合作伙伴 StreamNative 在架构设计与实现方案中予以的支持,在后续腾讯云中间件也将联合 StreamNative 共同维护本项目。


什么是 RoP?


与 KoP、MoP 和 AoP 相似,RoP 是一种可插拔的协议处理插件。


将 RoP 协议处理插件添加到现有 Pulsar 集群后,用户无需修改代码,便能将现有的 RocketMQ 应用程序和服务迁移到 Pulsar,同时还能使用 Pulsar 的强大功能,例如:


  • 计算与存储分离

  • 多租户

  • 跨地域复制

  • 分层分片

  • 轻量化计算框架 – Pulsar Functions


为什么开发 RoP?


Apache Pulsar 是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体。自 2016 年开源以来,Pulsar 已被广泛采用,并于 2018 年被指定为 Apache 顶级项目。


RocketMQ 是一款强大的开源分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。


Pulsar 和 RocketMQ 拥有广泛的用户群体和强劲的开发支持,全球许多头部公司都在使用这两种消息服务。同时,我们也收到了用户的需求,希望能在 Pulsar 与 RocketMQ 之间传输数据,并充分利用这两种消息系统的优势。


Apache Pulsar 通过对 Consumer 层的抽象,提供了队列和流两种消费模型的统一抽象。在 Client 与 Broker 的交互中,Pulsar 基于 Protobuf 的二进制协议,提供更高的性能和更低的延迟。除此之外,通过 Protobuf 协议,Pulsar 可以更容易地支持并实现多语言的客户端,比如:Java、CPP、Python 和 Go 语言等客户端。


但是,对于使用其他消息传输协议编写的应用程序(例如,RocketMQ),由于使用的消息处理协议和 Pulsar 不同,如果 Pulsar 想要兼容 RocketMQ 协议,为了将 RocketMQ 的协议适配到 Pulsar 的消息协议层中,用户需要重写整个协议层,这给用户的迁移和切换带来了很大的成本。


为了解决这个问题,最直观的处理方式是使用类似 Pulsar Connector 的形式,将用户在 RocketMQ 中的现存数据通过 RocketMQ Wrapper 的方式导入到 Pulsar 集群,但是这需要业务端更改自己的业务代码逻辑,同时需要确保两边的数据能够保证一致,这给使用 RocketMQ 的用户带来了很大的技术挑战。所以,能否给用户提供一个开箱即用的迁移策略和方案并且用户无需做任何代码修改呢?这便是 RoP 诞生的最初目的。


怎样开发 RoP?


Apache Pulsar 在 PIP-41(https://github.com/apache/pulsar/wiki/PIP-41%3A-Pluggable-Protocol-Handler) 中介绍了一种全新的接入方式。通过在 Broker 端暴露 Protocol Handler 插件,将 Netty 的 channel 和 Pulsar 的 Broker Service(https://github.com/apache/pulsar/blob/907fcb5ba8/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/BrokerService.java) 对象暴露给用户。这允许用户直接操作和调用 Pulsar 中比较低阶的 API(例如:PersistentTopic 和 ManagerLedger)。基于这个协议,用户无需更改代码,只需将服务请求转发到 RoP 中,RoP 利用 Protocol Handler 的插件将用户的请求转发到 Pulsar 中即可。


RoP 架构



通过对比 Pulsar 和 RocketMQ 之间的协议可以发现,二者在消息处理的思路上有不少相似之处,比如这两种协议都包含如下操作:


  • Topic Lookup: 所有 Clients 与任意 Broker 建立连接之前,会先去查找当前 Topic 的 Owner Broker。获取到对应的 metadata 之后,Clients 会与 Owner Broker 之间建立 TCP 连接进行数据的交互。

  • Produce: Clients 与 Topic 所在的所有 Owner Broker 之间进行通信并将消息 append 到对应的分布式日志中。

  • Consume: Clients 与 Topic 所在的所有 Owner Broker 之间进行通信并从分布式日志中读取指定的消息。

  • Offset: Producer 生产到 topic 中的消息会分配一个唯一的 offset,Pulsar 中使用 MessageID 来标识 offset。消费者可以通过 offset 去日志中获取指定位置的消息。


Apache Pulsar 的存储层使用了 Apache BookKeeper,Pulsar 相当于 BookKeeper 的 Client,通过调用 ManagerLedger 对象能够很容易的达到为分布式日志操作的目的。基于此,RoP 可以很好的将 RocketMQ 中对 commitLog 和 queueLog 的操作映射到 BookKeeper 中来。


RoP 概念


Offset 和 MessageID


在 RocketMQ 中,使用 offset 来标识消息的位置,当消息被生产到指定的 Topic 之后,会为每一个消息分配一个唯一的 offset;在 Pulsar 中,使用 MessageID 来唯一标识每条消息,每一个 MessageID 由三部分组成,ledgerIDentryIDpartitionID。我们通过合理的划分将 messageID 和 offset 进行映射,来唯一标识 Topic 中的每一条消息。


Message


对于一条消息,RocketMQ 和 Pulsar 都包含消息的 headers 和 payload 等字段,通过对消息协议的解析,我们可以轻松的将 RocketMQ message 转换为 Pulsar 的 message 格式。为了更好的兼容 Tag 消息的功能,在消息协议的处理方面增加了 8 字节的特殊字段,用来区分该消息是否属于 Tag 消息。


Topic Lookup


在 Pulsar 中,client 与 broker 建立连接之前,会根据当前传入的 Topic 执行 Lookup 操作,在 Broker 集群中寻找当前 Topic 所在的 Owner Broker,然后将该 Owner Broker 的地址返回并与 client 建立 TCP 连接,再进行数据交互。在 RocketMQ 中,client 与 broker 建立连接之前,会先处理 GET_ROUTEINTO_BY_TOPIC 命令,获取 topic 所在的路由信息后,建立对应的 TCP 连接,再进行数据交互。


如何使用 RoP?


目前,RoP 发布了 0.1.0 版本,你可以用过以下任一方式参与该项目:


  • 想上手试试?


可在以下网址下载 RoP 和查阅用户指南:https://github.com/streamnative/rop/blob/master/README.md。无论是快速启动 standalone RoP 或在现有 Pulsar 集群中部署 RoP,都可轻松实现。


另外,为了方便快速使用并验证 RoP,我们提供了 RocketMQ 的常见使用场景和用例,你可以直接使用这些代码示例验证服务:https://github.com/streamnative/rop/tree/master/examples/src/main/java/org/streamnative/rocketmq/example


  • 想解决问题?


如有任何问题,可以在 RoP GitHub repo 中 创建 issue 或加入 RoP 微信群进行讨论。无论哪种方式,RoP 资深专家都随时在线:https://github.com/streamnative/rop/issues/new


  • 想参与贡献?


RoP 源码开放并托管在 GitHub 上:https://github.com/streamnative/rop。如需改进功能或修复 bug,欢迎提交 PR。


2021-05-17 17:044226

评论 1 条评论

发布
用户头像
欢迎你关注 Apache Pulsar : http://github.com/apache/pulsar 下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,值得你关注研究🧐
2021-05-17 21:19
回复
没有更多了
发现更多内容

架构实战营模块五作业

渐行渐远

架构实战营

11 张图 | 讲透原理,最细的 Eureka 增量拉取

悟空聊架构

悟空聊架构

邀请函|2021 云原生实战峰会,邀请您免费现场参会报名

阿里巴巴云原生

阿里云 云原生 峰会

模块一作业

Geek_e6f7f6

架构实战营

Android C++系列:Linux进程间关系

轻口味

c++ android 28天写作 12月日更

超基础的机器学习入门-原理篇

凹凸实验室

机器学习 AI 低代码平台

四步轻松玩转微服务敏捷开发

阿里巴巴中间件

阿里云 微服务 云原生 敏捷开发 中间件

未来,区块链将在这些领域广泛应用!

CECBC

AI:人工智能 or 异类智能(Alien Intelligence)

mtfelix

28天写作

快速云原生化,从数据中心到云原生的迁移最佳实践

阿里巴巴云原生

阿里云 云原生 实践 迁云方案

硬核图解 SpringCloud 源码系列

悟空聊架构

SpringCloud 悟空聊架构 内容合集 签约计划第二季 技术专题合集

040022-week5-design

InfoQ_70156470130f

资产数字化的当下,数据隐私危如累卵

CECBC

说出你和「云原生」的故事,获得年度云原生顶级盛会通行证

阿里巴巴云原生

阿里云 开源 云原生 投稿

8 张图 | 剖析 Eureka 的首次同步注册表

悟空聊架构

中年人的沉重 2

张老蔫

28天写作

后端程序员福利套餐,22份资料合集,你能想到的关键技术,都在这里

奔着腾讯去

c++ golang Linux 音视频 学习资料

一场关于元宇宙公司之死的剧本杀

脑极体

6000字 | 深入理解 Ribbon 的架构原理

悟空聊架构

悟空聊架构

RocketMQ这样做,压测后性能提高30%

中间件兴趣圈

RocketMQ 性能 Apache RocketMQ

新晋 CNCF 沙箱项目 OpenClusterManagement 带来了它的最新特性

阿里巴巴中间件

阿里云 中间件 KubeVela cncf OCM

[Pulsar] 设置JWT认证

Zike Yang

Apache Pulsar 12月日更

模块5-微博评论高性能高可用计算架构分析

小何

「架构实战营」

车用能源的终极:氢能车落地普及还要多久?

脑极体

32 K8S之DaemonSet/Job/CronJob控制器

穿过生命散发芬芳

k8s 28天写作 12月日更

架构实战训练营|课后作业 模块 5

Geek_6bb688

解密 Dubbo 三大中心的部署架构

阿里巴巴中间件

阿里云 微服务 云原生 dubbo 中间件

趣谈“分布式链路追踪“组件发展史

悟空聊架构

分布式 链路追踪 28天写作 悟空聊架构 12月日更

Google 宣布将 Knative 捐赠给 CNCF

QiLab

Google Knative cncf

架构训练营第3期模块5作业

吴霏

架构训练营

SpringCloudAlibaba微服务技术栈精讲大合集

XiaoLin_Java

内容合集 签约计划第二季 技术专题合集

腾讯宣布开源 RoP:Apache Pulsar 支持原生 RocketMQ 协议_架构_冉小龙_InfoQ精选文章