RocketMQ 在同程旅行的落地实践

本文作者:刘树东 - 同程艺龙技术专家

01/使用概况
在这里插入图片描述
同程旅行选择RocketMQ主要基于以下几个方面的考虑:

技术栈:公司主要以 Java 开发为主,因此我们倾向于选择一款用 Java 实现的MQ,且没有任何第三方依赖为最佳;

久经考验:Rocket MQ 经历了阿里双11考验,性能、稳定性得到了充分验证;

功能实用:RocketMQ 的发送端提供改了同步、异步、单边、延时发送的功能;消费端有重试队列、死信队列以及消息重置功能,非常方便实用。

综合以上三点,我们选择了 Rocket MQ。

在这里插入图片描述

Rocket MQ 在同程旅行的使用场景有削峰、解耦、异步处理以及数据同步等。目前已经在公司各大业务线的核心系统里得到广泛使用,承受了来自微信入口的巨大流量,每天有1000+ 亿条消息周转。

图片

同程旅行RocketMQ 框架图如上。机票、交通和酒店三大业务线通过 Java SDK 以及Http Proxy 的方式接入到 MQ 集群。其中Http Proxy 主要为了方便其他语言客户端使用;同时为了更好地实现资源隔离,我们将后端服务端节点按照业务线做了物理隔离,能够最大程度地确保业务线之间不会互相影响。整个 MQ 集群通过 MQ 服务平台进行治理。

02/同城双中心

在这里插入图片描述

同城双中心主要为实现以下三个目标:

  • 单机放故障时保证业务可用

  • 保证数据可靠

  • 横向扩容

在这里插入图片描述

外部用户请求经过 LVS 以及 Nginx 调用服务与应用,应用底层主要调用了 MySQL、Redis 以及 MQ,双中心可分为同城冷备和同城双活两个方案。

在这里插入图片描述

同城冷备有两个 MQ 集群,分别是 source 集群和target 集群。生产者会将消息生产到 source 集群,之后经过消息同步集群将 source 集群里的元数据比如 topic、消费组、消息等同步给 target 集群。source 集群和 target 集群中的消费者都可以进行消费。

在这里插入图片描述

同城双活我们建立了跨中心的全局 MQ 集群。用户流量分散到两个中心,每个业务会将生产的消息往自己中心的 MQ 写。同时,其他服务与应用会从本中心消费所需消息。

在这里插入图片描述

当出现单机房 broker 节点故障时,每组 broker 的两 slave 位于不同机房,至少有一台 slave 拥有近乎全量的数据;消息生产会跨机房到另一个机房,另一个机房的消费者继续消费。

在这里插入图片描述

简单对比下,同城冷备方案需要 source 和target 两个集群,因此资源使用率不高,还需要同步 topic 、消费组、消费进度等元数据;同城双活方案资源使用比较合理,业务流量在何处,就在该处进行生产与消费消息。

在这里插入图片描述

同城双活有以下三点诉求:

①就近生产:生产端在A机房,则生产的消息也存于A机房的 broker。

②就近消费者:消费者在A机房,则消费者消息也来自A机房的 broker。

③broker 主节点故障,能够实现自动的选主。

在这里插入图片描述

就近生产与就近消费的核心问题是如何识别客户端与服务端是否在同一机房。识别客户端所在机房可以通过两个途径:

第一,获取客户端所在IP,然后通过第三方组件解析出 IP 所属机房;

第二,与运维人员配合,在每一台容器或物理机里设置环境变量,通过读取环境变量来感知客户端所在机房。比如从环境变量里读取到逻辑机房的 ID或逻辑机房的名称。

在这里插入图片描述

识别服务端机房有三种途径:

第一,通过 IP 查询,解析IP 段属于哪个机房;

第二,服务端节点向元数据节点注册时,在协议层增加机房标识;

第三,在 broker 名字上增加机房标识。

在这里插入图片描述

就近生产的原则:优先就近生产,就近生产无法满足时则跨机房生产。

如果机房后端的服务节点可用,则生产端会将消息生产到各自的机房里。如果机房的所有 broker节点都不可用,则生产端会将消息投递到另一个中心的 broker。

在这里插入图片描述

两个机房消费端都正常的情况下,每个机房的消费端只会消费本机房的消息。

在这里插入图片描述

如上图,如果idc 2 的消费端全部故障,则所有消息会被另一个机房idc1的消费端消费。

在这里插入图片描述

为了实现就近消费,我们实现了按机房分配队列算法:

每个机房的消息会平均分给此机房的消费端;

如果机房没有消费端,则消息会平均分配给其他机房的消费端。

在这里插入图片描述

故障切主的实现步骤如下:

第一步:Nameserver 基于 raft 协议选主;

第二步:所有 broker 向 Nameserver leader 节点注册,leader 节点将 broker 的注册信息同步给其他 Nameserver 节点;

第三步:broker主节点出现异常时,由Nameserver 负责从剩下的 broker节点里重新选主节点;

第四步:此时生产端无法向旧broker leader发送消息。如果旧 broker的主节点复活,则会自动切换成从节点。

在这里插入图片描述

Nameserver 元数据系统有一主多从,broker 有一台 master 与两台 slave。如果 master 故障,则 Nameserver 元数据系统会从 slave1 与 slave2 中根据一定的条件,比如根据同步进度或版本号选出新主,上图为将 slave2 选为主。之后新主会向 nameserver 元数据系统注册,并将版本号+1。如果旧主复活,因会其版本号小于新主版本号被切为 slave。

在这里插入图片描述

在生产环境中实际操作了双中心演练,具体流程如下:

1)14:30开始切域名,将流量切到一个机房(二中心)。三四分钟后,二中心的流量已超过一中心,一中心的流量趋近于零;

在这里插入图片描述

2)15:00左右,将流量回归双中心;

3)15:30左右,又将流量切回一中心。可以清晰地看到,在流量切到一中心时,二中心的消息生产趋近于0。

整体来看,双中心的演练较成功,实现了消息的生产跟着流量走。

在这里插入图片描述

简单总结下,双中心方案为跨机房建立了全局MQ集群,生产与消费都遵守优先就近原则,配置一主二从,一主一从消息写成功即认为消息写入成功。Nameserver 通过 Raft 协议选主,选完主后会监控每一组里 broker 的 leader 节点。如果 broker 的 leader 节点出现故障,则会从这一组剩下的 slave 里选新的主节点。

03/平台治理

平台治理至关重要,可以让环境变得更加稳定可靠,出现异常时可以及时向使用方发出告警,出现故障时可以快速定位。MQ 的平台治理分为主题消费组治理、客户端治理以及服务端治理。

在这里插入图片描述

主题消费组的使用按照先申请后使用的原则,出现问题时可以根据主题与消费组的申请人找到该主题。MQ 环境分为很多种,可以一键申请所有环境或只限制生产环境的申请,将其他环境的申请放开。对于主题而言,我们给每一个主题限制了最大生产速度,防止单一主题生产过快从而影响其他主题的生产。

消息堆积到一定阈值时,可以向业务方发出告警,通知其处理;长时间不处理可以取消消费组的消费权限或重置消费进度,防止因消息大量堆积而影响生产与消费。若消费端节点掉线一定时间之后没有重新上线,可向业务方快速发布告警,通知其及时处理。

在这里插入图片描述

客户端治理主要执行一些统计与检测工作,会统计每一条消息的生产消费耗时、消息大小、重复消费的次数。如果生产/消费端版本过低或当前版本存在 bug ,也可以向业务端发出通知。

这一系列的统计和检测最终需要为消息的全链路追踪服务。统计和检测会记录消息相关信息,包括每一条消息在哪个时间点、从哪个业务IP与端口号发送到服务端的哪个节点、于什么时间被哪些服务的消费端在什么时间点消费,以及消费耗时、消费的重复次数等信息,可以很方便地排查所需信息。

在这里插入图片描述

服务端治理负责集群的自我保护、集群健康巡检、集群性能巡检和集群高可用。集群的自我保护主要针对生产与消费,尤其是生产的消息过快或有大量消息积压时;性能巡检可通过实时发送一批不同大小的消息来检测生产和消费的情况;集群的高可用指出现故障时,服务平台能及时发出通知。

在这里插入图片描述

通过几张图展示下实际的治理,在 MQ 服务平台上,可以申请 topic 和消费组的上线、下线以及权限。

在这里插入图片描述

上图展示了每个集群每分钟的消息生产消费以及堆积曲线。

在这里插入图片描述

MQ 平台还提供了集群监控的功能,可以查看当前集群 topic 、消费组织数量、消息的intps、outtps 以及 broker 的数量。同时,可以查看每一台 broker 消息生产排名以及消息积压排名,方便故障时的问题排查。

在这里插入图片描述

使用 Rocket MQ 的过程中,我们也踩了不少坑。

1)做双中心版本升级时,没有考虑到版本的向下兼容,队列的分配算法有问题,导致部分消息被重复消费多次,部分消息没有被消费;

2)某一台 broker上主题消费组数量过多时,会导致 Nameserver 注册耗时过长。如果很多 broker 上的主题消费组都很多,就会导致broker的内存 OOM;

3)由于 topic 长度判断不一致导致服务端重启时会丢失少量消息;

4)broker 进程会假死,后证实为os版本问题,升级os版本即可解决。

04/未来展望

在这里插入图片描述

同程旅行针对 RocketMQ 的未来规划分为以下三个方面:

第一,历史数据归档。很多业务方对数据的反查要求周期较长,而线上生产环境的消息实际的存储时间可能只有2-3天,我们将考虑从历史归档数据里查询;

第二,底层存储剥离,计算与存储分离。目前社区新版本已经支持该能力;

第三,期望利用沉淀的历史数据帮助业务完成更多数据预测,比如订单量、退改量等数据的预测可以更好地帮助业务解决问题,同时也可以为业务机器做扩缩容提供支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34908.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

火爆全网的个人行程卡纪念版!3秒教你快速生成!

大家好 咱们直接开门见山! 3 秒生成你的专属行程卡纪念版 用下面这款小工具,只需要 3 秒,就能帮大家生成【行程卡纪念版】。 用一张图片记录你三年去过的地方。 回顾过去三年,我们发现许多美好的回忆已经深深地留在了我们的心中。…

CAN网络管理唤醒功能

采用1043的can 芯片:工作模式 – 正常模式 – 具有 INH 输出以及本地和远程唤醒请求功能的待机模式 – 具有 INH 输出以及本地和远程唤醒请求的低功耗睡眠模式 状态切换流程图: CAN唤醒的需求: 唤醒请求(Wake Up Request) 唤醒请求可分为两种: ● 主动唤醒请求:来自模…

(智能车比赛)基于 ADS 逐飞库 英飞凌 TC264 377系列 的多核使用经验

多核并行主要有两个方面 一,程序,变量储存地址设置 二,运行核选择 一、内存分配 概念及过程描述 尽量将不同的功能划分为各个模块,然后交给不同的cpu运行。 或者说不同的cpu负责运行不同的功能,cpu之间以少量的参…

CK-UR05-US桌面式超高频RFID发卡器开发手册之USB控制命令格式

CK-UR05-US桌面式超高频RFID发卡器支持USB控制命令格式,本文重点就此格式展开说明! CK-UR05-US桌面式超高频RFID发卡器 1、取版本号(GetReaderVersion) 功能:取读写器的硬件、软件版本 命令码: 02H 命令参数:无 命令包: 『40H 02H 02H BCH』 举例: 如…

RFID课程设计-图书管理系统用户端设计

RFID课程设计-图书管理系统用户端设计课程设计题目课程设计任务内容题目设计基本原理NFC开发概述标签调度系统如何将 NFC 标签映射到 MIME 类型和 URI如何将 NFC 标签分发到应用在 Android 清单中请求 NFC 访问权限过滤 NFC IntentACTION_NDEF_DISCOVEREDACTION_TAG_DISCOVERED…

Linux炫酷终端仪表盘

最近发现了一个适合装逼的终端命令,会在终端显示一个炫酷的仪表盘(提示:终端全屏显示效果才好) 先上图 首先安装三个软件 sudo apt-get install node nodejs-bin sudo apt install nodejs-legacy sudo apt install git 待会会下…

【袋鼠云】标签系统

文章目录 客户画像标签建设的演进1. 业务单元独立作战2. 离线数仓统一建设3. 实时数据多维补充4. 标签产品化管理5. 数据智能化管理 标签体系设计与加工一、标签体系设计1. 数据梳理2. 基于OLP模型体系化梳理标签3. 定义标签与加工口径 二、标签模型设计三、标签配置1. 根据业务…

AI最新开源:LMSYS Org开源LongChat、法律大语言模型ChatLaw、中文医疗对话模型扁鹊

一周SOTA:LMSYS Org开源LongChat、法律大语言模型ChatLaw、中文医疗对话模型扁鹊 文章目录 1. LMSYS Org发布LongChat,上下文碾压64K开源模型2. 北大团队发布法律大模型 ChatLaw3. 扁鹊:指令与多轮问询对话联合微调的医疗对话大模型 1. LMSY…

pta中级题库

目录 7-1 三个整数排序 7-3 求数列前n项之和 7-4 求一组数据的平均值 7-5 输出图形 7-6 一行字符变换 7-7 sdut- C语言实验——删除指定字符 7-35 二维数组中每行最大值和每行和 7-36 矩阵转置 7-38 二维数组元素变化 7-39 沙漏图形 7-40 连接两个字符串 7-41 统计…

基于等照度线和窗口匹配的图像修补算法

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、关于图像修补 图像修补的目的是基于已有的图像信息或数据库内信息,对缺失区域进行合理地修复。在诸多领域如电影、…

pyecharts-Timeline讲解时间线

Pyecharts----Timeline (*^▽^*) 作者:发现美的眼睛(本人) 首先简单介绍一下pyecharts这个神奇的东东,如果你是从事web,那么Echarts就会熟悉知晓。 ——如果不是,那么这篇文章也会推荐一个非常好的&#x…

计算机网络英语作文150字,微信投票的英语,写一篇关于网络投票看法的英语作文150字左右...

你好微信投票的 Should students make friends online? Some people say yes Internet helps people make many friends Chatting on line, students can express their feelings and opinions more freely, and even get help for their foreign language studies Others, ho…

关于计算机500字英语作文,小学英语作文500字(共8篇)

小学英语作文500字由好范文网的会员“迈和”投稿精心推荐,小编希望以下多篇范文对你的学习工作能带来参考借鉴作用。 第1篇:小学英语作文500字 猜你正在找小学英语作文500字的怎么写?那么就给你这篇范文参考。 Im a happy girl.my english na…

关于计算机500字英语作文,500字英语作文范文

3 500字英语作文范文二 Protecting the Intangible Cultural Heritages Like tangible cultural heritages such as the Great Wall and the Forbidden City, intangible cultural heritages like Peking Opera and Confucius-commemorating rituals are equally crucial. We s…

Yarp项目代理ChatGPT,解决网络无法访问openAI的问题

1.创建Yarp项目 目的:通过代理解决网络无法访问openAI的问题 项目源码地址:https://github.com/raokun/YarpProject 1.创建.net7 webapi项目 创建一个webapi项目 2.搜索安装nuget包 1.搜索最新的Yarp.ReverseProxy包 https://www.nuget.org/package…

GPT-4 价值 20 美金的回复:是拯救还是毁灭?

编者注 - 周末闲着无聊,我们分别对比研究了 ChatGPT 2、3、4 版本的对话内容,结果发现,相较于前两个版本,第四版的精准度确实有所提高,但ChatGPT - 4 需要付费 20 美金。为了让这个发现更加有趣,我从网上挑…

【解决密码栏不显示】“可能是其他人在试图访问您的google账号....”

背景:Google浏览器上的账号自动退出了。 起因:自己又记成了邮箱的密码,多输入了几次,导致账号被锁不显示密码栏。 经过: 一、网上找了很多方法,有①重置②卸载等 二、我只重置了,但未卸载&a…

ORACLE锁定账户的原因及解决办法

工作中,发现一个ORACLE用户被锁定,查看状态如下图: profile可以用来对用户所能使用的数据库资源进行限制 查看monitor使用的profile: SELECT PROFILE FROM DBA_USERS WHERE USERNAMEMONITOR;结果如下: 查看对应的pro…

当提示“当前帐户被锁定,可能无法登录”时,如何解锁帐户?

解锁帐户的方法 错误提示解锁方法等待30分钟移除账户锁定阈值检查DNS设置设置密码永不过期清除缓存的凭据域环境中的帐户解锁错误提示 在登录电脑时,有时会出现如下登录错误的提示,我们可以按照以下几个方法来解锁账号。 解锁方法 等待30分钟 有一个设置用于配置输入错误…

关于oracle账户被锁定的解决办法

1.win r,输入cmd 2.输入sqlplus/nolog 3.输入conn/as sysdba 4.输入解锁语句:alter user 用户名 account unlock; 5.然后退出,输入用户名,密码,重新连接数据库成功