腾讯云分布式高可靠消息队列CMQ架构

腾讯云分布式高可靠消息队列CMQ架构针对金融 交易 订单等对可靠性 可用性有较高要求的业务场景 本文分享如何通过 CMQ 消息队列实现高可用架构


针对金融、交易、订单等对可靠性、可用性有较高要求的业务场景,本文分享如何通过CMQ消息队列实现高可用架构
作者:张浩        
出处:腾云阁文章
———————-





在分布式大行其道的今天,我们在系统内部、平台之间广泛运用消息中间件进行数据交换及解耦。CMQ是腾讯云内部自研基于的高可靠、强一致、可扩展分布式消息队列,在腾讯内部包括微信手机业务红包、腾讯话费充值、广告订单等都有广泛使用。目前已上线腾讯云对外开放,本文对腾讯云CMQ 核心技术原理进行分享介绍。

CMQ消息队列主要适用于金融、交易、订单等对可靠性、可用性有较高要求的业务场景。

腾讯云分布式高可靠消息队列CMQ架构
图1-某充值系统结构

图中腾讯云消息队列CMQ整体结构如图2所示,本文重点介绍后端broker set实现原理。通常情况下一个set由3个节点组成,通过多副本保证消息的可靠性、多节点提高系统可用性。当然,可以根据业务的实际需求通过增加set内节点个数来进一步提高可靠性和可用性,

腾讯云分布式高可靠消息队列CMQ架构
图2-CMQ整体架构图
腾讯云分布式高可靠消息队列CMQ架构
图3-brokerset 内部结构图

生产可靠

如图3所示,客户端生产的消息在set 中超过半数的broker 刷盘成功后会返回确认消息告知生产消息成功。如果在一定时间之内客户端没有收到确认信息需要重试来确保消息发送成功。

可靠生产带来的一个问题就是消息的重复,在网络异常等情况下很可能CMQ broker已经存储消息成功只是确认包在网络上丢失了,这样客户端重试生产后,在broker上存在两条重复的消息。考虑到消息去重开销较大,目前消息的幂等性需要业务逻辑来保证。

存储可靠

腾讯云分布式高可靠消息队列CMQ架构
图4-数据存储原理示意图

由此可见,对于返回客户端成功的消息至少是分别在两个节点磁盘上存储成功的,这就将磁盘故障引起的数据丢失大大降低。另外数据在磁盘上存储时会将检验结果一同记下来,消费者在消费数据之前CMQ broker 会进行比较,确保消息是完整有效的。

消费可靠

消费者拉取消息时会指定当前消息的隐藏时间,在隐藏时间内消费者比较显式的对消息进行确认删除,如果超过隐藏时间没有主动删除,此条消息将重新对外可见,可以继续消费。

显式确认删除消息是为了防止消息在投递、处理过程中异常而导致的消息丢失。

对于消息的确认信息 CMQ broker的处理逻辑和生产消息过程类似,也是一个写入的过程,不同的是此时写入的数据的内容是msgid 和消息状态。

强一致实现

假如一个set中有3个节点(A, B, C),A为leader,B C 是follower。如上图所示,对于返回客户端成功的请求数据在CMQ 中至少在两个节点上存在,假设为A B,此时如果leader A故障,B C 两个follower 会自动选举出一个新leader,CMQ 使用的raft 算法可以保证这个leader 一定是拥有最全量log 信息中的一个,在此必定是B。此时B继续对外服务,B 和A 拥有相同的已经返回确认给用户的全量数据视图,数据是强一致的。

腾讯云分布式高可靠消息队列CMQ架构

可用性保证

腾讯云分布式高可靠消息队列CMQ架构

如上文所述,master 负责所有消息的生产消费,当master 故障时SET中其他follower节点会自动选举出一个新leader,客户端请求会自动重定向到leader节点,RTO和配置的选举超时时间有关,目前是在5s左右。大致过程如上图6所示。

CMQ单个set 在CAP理论中优先保证了CP,当SET中过半数节点都正常工作时,才能进行消息的生产消费。对于SET多个节点同时故障的不可用情况,CMQ强大的监控调度能力能够快速对queue进行调度迁移恢复服务,将不可用时间降到最低。

横向扩展,无限堆积

腾讯云分布式高可靠消息队列CMQ架构

上文中SET的概念对用户来说是透明无感知的,CMQ controller server 根据set的负载情况实时对queue进行调度搬迁。如果某个queue的请求量超过当前set的服务阈值,controller server 可以将queue 路由分布到多个set 上来提高并发量,对于需要海量堆积的服务来说可以通过路由调度来提升堆积上限,理论上可以达到无限堆积。

目前CMQ只能保证特定情况下消息的严格有序,例如需要保证单个生产进程、单个消费进程,或者queue的消费窗口设定为1等条件。

全路径消息trace

CMQ系统中,一条消息的完整路径包含生产者、broker、消费者三个角色,每个角色处理消息的过程中都会在trace 路径中增加相关的信息,将这些信息汇聚即可获取任意一条消息的状态和当前经过的完整路径,从而为生产环境中的问题排查提供强有力的数据支持。大大降低了业务定位问题的难度。

小结

CMQ是基于raft 算法来保证数据高可靠、强一致的分布式消息队列,主要服务于订单、交易类业务场景。消息的幂等性需业务侧来保证,在特定情况下可以保证消息严格有序。
对于更侧重高性能、高吞吐量业务需求,腾讯云由另外一个消息引擎来提供服务,在协议上同时兼容kafka,很好的满足了大数据场景,具体原理请留意后续文章介绍。

—————————–
获取更多云计算技术干货,可请前往腾讯云技术社区

微信公众号:腾讯云技术社区( QcloudCommunity)

腾讯云分布式高可靠消息队列CMQ架构


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210785.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午11:55
下一篇 2026年3月18日 下午11:55


相关推荐

  • html grid_react datagrid

    html grid_react datagridASP.NETMVC3Beta初体验之WebGrid   ASP.NETMVC3Beta中除了推出一种新的视图引擎Razor。还推出了几种新的HtmlHelper。我比较关注的是WebGrid,这篇文章将介绍一下WebGrid的使用。WebGrid提供了分页和排序的功能,在此之前在MVC中分页和排序时需要自己去写的。这篇文章将分别介绍在aspx视图引擎和Ra

    2022年10月6日
    5
  • JS 暂时性死区

    JS 暂时性死区JS暂时性死区ES6暂时性死区引用ES6暂时性死区只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。vartmp=123;if(true){tmp=’abc’;//ReferenceErrorlettmp;}上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后…

    2022年6月30日
    28
  • LabVIEW角点检测(基础篇—10)

    LabVIEW角点检测(基础篇—10)角点是图像中一种特殊的特征点 基于角点进行图像检测和匹配 能在较难找到图像特征的情况下 创建图像拼接或图像匹配应用

    2026年3月26日
    2
  • ottomator-agents中的智能人类学:人类文化研究的智能体

    ottomator-agents中的智能人类学:人类文化研究的智能体

    2026年3月15日
    2
  • eplanwin10激活码获取_在线激活

    (eplanwin10激活码获取)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsaWN…

    2022年3月27日
    312
  • mac配置环境变量不生效

    mac配置环境变量不生效mac修改环境变量原理:主要原因是每次终端启动时候zsh加载的是/etc/zshrc文件,而‘zshrc’文件中并没有定义任务环境变量。cd/etc/vizshrc最后一行添加:source~/.bash_profile保存,重新打开终端即可…

    2022年6月21日
    184

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号