Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于 RocketMQ 实现 AMQP 协议实践

基于 RocketMQ 实现 AMQP 协议实践

作者头像
腾讯云中间件团队
发布于 2025-02-10 13:14:10
发布于 2025-02-10 13:14:10
2560
举报

导语

在Apache CoC 2024 杭州站大会中,腾讯云高级工程师张乐为与会者带来了精彩的演讲。围绕《基于 RocketMQ 底座实现 AMQP 协议》的背景、目标、方案设计以及几个核心技术实现做了详细的阐述。

作者简介

张乐

腾讯高级工程师,负责腾讯云 RabbitMQ Serverless 商业化开发。

10年中间件开发经验,开源社区爱好者,Apollo、Spring Cloud Tencent PMC。

背景

AMQP 协议

AMQP(Advanced Message Queuing Protocol) 是 2004年左右由业界的几个大公司一起制定的高级消息队列协议,目标是跟 HTTP 一样广泛使用的面向消息的标准通信协议。

图:AMQP 模型

AMQP 核心模型

● Virtual Hosts(虚拟主机

○ 用于多租户逻辑隔离,例如可以用于区分测试、预发、生产环境。

● Exchange(交换机)

○ 在 AMQP 协议中,生产者往 Exchange 里发送消息,消息发送到 Exchange 之后,根据 RoutingKey、BindingKey 的匹配关系把消息分发到相应的目标队列。

● Queue(队列)

○ 一组消息的集合,消费者通过拉或者推的方式从队列里消费消息。

目前市面上最主流的 AMQP 实现者是 RabbitMQ,实现的 AMQP 协议版本是 0.9.1。在 Kafka、RocketMQ 、Pulsar 等新型消息队列产品问世之前,RabbitMQ 是最流行的消息队列之一。所以 RabbitMQ 在国内外还是有大量的公司使用,例如传统的金融行业。

RabbitMQ 协议的局限性

腾讯云托管了开源版本的 RabbitMQ,为用户提供开箱即用的 RabbitMQ 产品。在运维成百上千套 RabbitMQ 集群过程中,我们也发现了开源 RabbitMQ 的一些局限性,例如以下列出的几点:

抗堆积能力弱

通常 RabbitMQ 集群由三副本组成的一个分布式集群,通过副本之间的消息复制保证消息的高可靠性。不能做到无限的水平扩容,提升集群的服务水位。导致了集群抗堆积能力弱、单集群的 TPS 上限有限。所以 RabbitMQ 一定程度上不适用于大规模的消息队列场景。

网络分区问题

RabbitMQ 支持 Raft 模式消息复制,在 Raft 模式下,容易导致网络分区的问题。

二次开发、运维难

RabbitMQ 使用 Erlang 小众语言开发,导致二次开发门槛极高,只能通过调参、重启等比较被动的方式运维 RabbitMQ。

延迟消息插件不稳定

延迟消息在消息队列产品中是使用非常广泛的功能,但是在 RabbitMQ 实现中,延迟消息插件打开之后,很容易导致集群出现 OOM 等不稳定的情况。

技术选型

基于 AMQP 的广泛性以及开源 RabbitMQ 的局限性,我们的目标是非常明确的。要实现一套完全自主可控、高可扩展性、低运维成本的 AMQP 协议的消息队列产品。

我们最终选择了基于 RocketMQ 实现 AMQP 协议,主要有下面几个点的考虑:

  1. 完全自研一套 MQ 产品,成本高、时间周期长、稳定性难保证。
  2. 目前 RocketMQ 在在线消息领域使用非常广泛,并且新版本的 RocketMQ 提供 了 LMQ、POP 等特性,使其在适配 AMQP 协议的复杂度上大大降低。并且 RocketMQ 经过多年的发展,在稳定性、性能、功能上表现都非常优异。
  3. 腾讯云有专门的 RocketMQ 团队,提供了技术保障。

AMQP On RocketMQ 系统架构

图:架构图

服务端侧一共分为两层。

1. RocketMQ 存储池

a. 由多套 RocketMQ Broker 组成的消息存储池,可以通过水平垂直扩容单个 Broker 集群,或者增加更多的 Broker 集群,达到无限容量的效果。

2. Proxy 适配层

a. 在 Proxy 层适配了 AMQP 协议, 一个 Proxy 集群等于一个 AMQP 集群。

b. 几乎无状态,可以水平横向无限扩容。

c. 一个 Proxy 集群只会绑定到一个底层的 Broker 集群。

d. Proxy 元数据存储数据库里,多个 Proxy 集群共享数据库,通过 Proxy Id 逻辑隔离。

这种架构和最新的 RocketMQ 5 架构完全一致,可以认为是存算分离架构,便于实现 Serverless 产品形态。

核心技术点

模型映射

LMQ(Light Message Queue)

在 RocketMQ 模型中 Topic 是最核心的模型,同时也非常的”重“,消耗的资源多。当 Topic 数量增加到万级别之后,Broker 的稳定性会有比较大的影响。在 AMQP On RocketMQ 模型中, Broker 作为上层 Proxy 的共享集群,如果 AMQP 的 Queue 映射到 RocketMQ 的 Topic 就会产生大量的 Topic。RocketMQ 为了解决这个问题,支持 LMQ(Light Message Queue)队列,这种队列更加轻量,能支持到百万级别的量级。

LMQ 实现的原理是基于 RocketMQ 比较灵活的消息存储模型,如下图所示:

图:RocketMQ 存储模型

所有 Topic 的消息都追加写入到同一个 CommitLog 文件中,并同时维护消息索引文件组成消息队列。

通过这个模型,很容易扩展出 LMQ 能力。只需要在每条消息上增加一个属性(lmq)标识这条消息归属于哪些队列。然后通过属性就能反向聚合出队列的消息集合,如下图所示:

图:LMQ 模型

这种模型下,一个LMQ只是多维护了一个队列索引文件,所以非常的轻量。

最终的模型映射如下所示:

● 一个 Proxy 集群映射到 RocketMQ 的一个 Topic。

● AMQP 中的 Queue 映射到 RocketMQ 的一个 LMQ。

图:模型映射

收发消息核心链路

发送消息

  1. SDK 发送消息到 Proxy 层,Proxy 根据 Exchange 的 BindingKey 计算目标队列集合。
  2. Proxy 层通过 RocketMQ SDK 向 RocketMQ Topic=proxyId 发送一条消息,并且消息携带 lmq=List属性。

图:发送消息

消费消息

AMQP 支持两种消费模式拉和推。

图:消费模型

拉模式

拉模式相比于推模式更加简单,直接在 Proxy 层把 AMQP 的拉消息请求转化成 RocketMQ 的一个 POP 请求,完全无状态,透明转发即可。

推模式

推模式复杂一些,需要在 Proxy 层实现拉转推的逻辑。Proxy 层内置定时从 RocketMQ POP 消息的线程池,获取到消息后,通过长连接把消息推送给客户端。

二进制协议解析

AMQP 自定了数据帧的二进制格式,如下所示:

图:帧格式

在 Proxy 层需要解码、编码二进制包,这部分的工作还是非常复杂的,很容易出现不兼容的问题。因为我们的 Proxy 是用 Java 语言实现的,正好 Java 语言也有一个 AMQP 实现(QPID)已经做了这部分的工作,我们只需要实现 QPID 定义的协议接口指令即可,这样可以大大简化我们的开发工作量。

功能&性能

因为 AMQP 协议非常的复杂,目前我们实现的版本适配了绝大部分的核心功能。

Function

AMQP On RocketMQ

RabbitMQ

Delay Message

Supported

Plugin (Unstable)

Retry Message

Supported

Not Supported

Message Track

Supported

Plugin

Transaction Message

Not Supported

Supported

Sequential message

Not Supported

Supported

Priority Message

Not Supported

Supported

性能上目前只做了初步的性能调优,基本能满足绝大部分用户的需求,后续我们会做更加深入的性能调优。

图:压测数据

未来展望

我们计划 25年 Q1 在腾讯云上线 RabbitMQ Serverless 形态,逐步开放给内外部用户公测使用。并在 25年年底把产品打磨的更加稳定、成熟,和开源托管版形成互补,满足不同体量的腾讯云用户诉求。 在开源方面,我们会在某一个合适的时机开源出来,一方面回馈社区,另外一方面通过社区的力量把产品打磨的更加完善。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云中间件 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RabbitMQ:基础概述
RabbitMQ 是一个消息中间件,它接收消息并且转发,是“消费-生产者模型”的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。
栗筝i
2022/12/11
8530
RabbitMQ:基础概述
初识rabbitMQ,了解下rabbitMQ?
由于项目的发布加班导致的文章有一天文章没有发很烦躁,而且打乱的我的发文章的顺序,本来是想着每天在08:08的时候发布的,但是在经过那次的发布彻底的打乱了我发布文章的时间和间断,我想以后还会经常的有这种事情的发生,所以打算每天的发布时间就不确定了,即随机的发文吧!
技术从心
2019/08/07
8300
初识rabbitMQ,了解下rabbitMQ?
横贯八方揭秘RabbitMQ、RocketMQ、Kafka 的核心原理(建议收藏)
今天我们通过一篇文章来认识一下常见消息队列RabbitMQ、RocketMQ、Kafka。
路人甲Java
2023/11/14
1.5K0
横贯八方揭秘RabbitMQ、RocketMQ、Kafka 的核心原理(建议收藏)
RabbitMQ、Kafka对比(超详细),Kafka、RabbitMQ、RocketMQ的区别
RabbitMQ和Kafka是两种流行的消息传递系统,它们在多个方面存在显著的差异。
寻求出路的程序媛
2024/08/07
5.9K0
RabbitMQ、Kafka对比(超详细),Kafka、RabbitMQ、RocketMQ的区别
从RabbitMQ平滑迁移到RocketMQ技术实战
大量业务使用消息中间件进行系统间的解耦、异步化、削峰填谷设计实现。公司内部前期基于RabbitMQ实现了一套高可用的消息中间件平台。随着业务的持续增长,消息体量随之增大,对消息中间件平台提出了更高的要求,此外在运维过程中也遇到了高可用难以保障,功能特性不足等诸多问题。基于遇到的这些问题,决定引入RocketMQ进行替换。本文将介绍基于RocketMQ建设消息中间件平台并实现在线业务无感知的平滑迁移。
2020labs小助手
2022/08/01
1.5K0
RocketMQ 和 RabbitMQ 的比较以及 RocketMQ 的使用
消息队列在项目中会经常用到,目前我们使用的是 RabbitMQ,但在 Java 技术栈下,RocketMQ 使用的比较多。下面比较下 RabbitMQ 和 RocketMQ。 RabbitMQ 和 RocketMQ 对比 1、设计理念和架构
郑子铭
2025/02/25
1.2K0
RocketMQ 和 RabbitMQ 的比较以及 RocketMQ 的使用
MQ - 09 RabbitMQ的架构设计与实现
最基础的消息队列应该具备通信协议、网络模块、存储模块、生产者、消费者五个模块。
小小工匠
2023/09/21
7240
MQ - 09 RabbitMQ的架构设计与实现
科普 — 关于Rabbit MQ与AMQP协议概念,你想了解的都在这里...
导语 本文从AMQP协议(Advanced Message Queuing Protocol,高级消息队列协议)、消息功能、消费模型、金融级用法及其他功能点对比等概念介绍对RabbitMQ做了科普, 希望对各位深入理解RabbitMQ有帮助。 AMQP协议概念 AMQP协议自身定义了很多概念,下面先对这些概念进行剖析,会更侧重从每个概念实体的作用域、职责范围、从属关系等维度进行介绍。 AMQP协议概念实体图 Connection 对应底层一个AMQP-Client到RabbitMQ-B
腾讯云中间件团队
2021/11/10
1.8K0
AMQP协议
说到消息队列,相信大家并不陌生。大家在日常的工作中其实都有用过。相信大部分的研发在使用消息队列的过程中也仅仅是停留在用上面,里面的知识点掌握得并不是很系统,有部分强大的功能可能由于本身公司的业务形态或者业务量级的原因根本无法触及到。老猫在工作中就是如此,所使用的MQ都是架构师封装好的,简单调用即可。为了更好地了解其所以然,所以老猫就花时间好好梳理了一下MQ的一系列的知识点,俗话说“好记心不如烂笔头”,所以老猫在学习的过程中就记录了下来。分享出来给有需要的小伙伴,当然也方便后续自己查阅,因此就有了该系列文章。
用户7353950
2022/06/23
5650
AMQP协议
《RabbitMQ这一篇就够了》
RabbitMQ转载原文【推荐】:https://www.jianshu.com/p/78847c203b76
2020/11/24
8270
RocketMQ 设计原理与最佳实践
RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。
Java识堂
2021/06/01
1.3K0
RocketMQ 设计原理与最佳实践
Kafka、RabbitMQ、RocketMQ等消息中间件的介绍和对比
在分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。现在开源的消息中间件有很多,前段时间产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注。
java思维导图
2019/12/05
5.5K0
Kafka、RabbitMQ、RocketMQ等消息中间件的介绍和对比
RocketMq 基本扫盲
本篇是RocketMq扫盲,并不会讲到各个组件实现的细节内容,这里从整体全局的角度看关于RocketMq的整体设计。
阿东
2022/09/11
8850
RocketMq 基本扫盲
RabbitMQ
消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。
许喜朝
2022/05/05
6680
AMQP与RabbitMQ笔记
AMQP全称是Advanced MessageQueuing Protocol (高级消息队列协议)。其官方网站在[1]。
星哥玩云
2022/06/29
3800
AMQP与RabbitMQ笔记
RabbitMQ与AMQP协议
AMQP(Advanced Message Queuing Protocol, 高级消息队列协议)是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。 RabbitMQ是一个实现了AMQP协议标准的开源消息代理和队列服务器。 1、基本概念 在服务器中,三个主要功能模块连接成一个处理链完成预期的功能: 1)“exchange”接收发布应用程序发送的消息,并根
用户1225216
2018/03/05
1.6K0
RabbitMQ与AMQP协议
RabbitMQ 系列AMQP协议
ZeroMQ和RabbitMQ是目前两种业界最为流行的消息队列,ZeroMQ的优势在于性能和轻量级,使用上类似于Socket通信,帮助应用封装了底层通信的细节,同时异步和不持久化消息的特点使得ZeroMQ拥有极其出色的性能,适用于高吞吐量/低延迟的应用场景。同时ZeroMQ与一般的消息中间件不同,它不需要部署和运行消息服务器,其客户端扮演了消息服务器的角色。但是,过于专注底层通信的设计理念让ZeroMQ灵活的同时也让应用披上沉重的包袱,对于一些不允许丢失消息的应用场景,应用不得不考虑消息的持久化的问题或者通过重发避免消息丢失。同时,异步发送消息的实现方式使得客户端无法参与消息的发送过程,这也是ZeroMQ设计上本身就无法支持事务的一个原因。
后端技术探索
2018/08/09
8250
消息队列基本原理和选型对比
作者:anncdchen,腾讯 PCG 后台开发工程师 消息队列使用场景 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,削峰填谷等问题。实现高性能、高可用、可伸缩和最终一致性架构。 解耦:多个服务监听、处理同一条消息,避免多次 rpc 调用。 异步消息:消息发布者不用等待消息处理的的结果。 削峰填谷:较大流量、写入场景,为下游 I/O 服务抗流量。当然大流量下就需要使用其他方案了。 消息驱动框架:在事件总线中,服务通过监听事件消息驱动服务完成相应动作。 消息队列模式 点对点模
腾讯技术工程官方号
2022/08/26
1.2K0
消息队列基本原理和选型对比
RocketMQ简介
MQ是把消息和队列结合起来,称为消息队列(MessageQueue),是基础数据结构中“先进先出”的一种数据结构。指把要
会洗碗的CV工程师
2024/05/05
3000
RocketMQ简介
RabbitMQ 入门
MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。
ma布
2024/10/21
1060
RabbitMQ 入门
相关推荐
RabbitMQ:基础概述
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档