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

01 运用概况

RocketMQ 在同程旅行的落地实践

同程游览挑选RocketMQ首要依据以下几个方面的考虑:

  • 技术栈:公司首要以 Java 开发为主,因此咱们倾向于挑选一款用 Java 完成的MQ,且没有任何第三方依赖为最佳;

  • 久经考验:Rocket MQ 阅历了阿里双11考验,功用、稳定性得到了充沛验证;

  • 功用实用:RocketMQ 的发送端供给改了同步、异步、单边、延时发送的功用;消费端有重试行列、死信行列以及音讯重置功用,十分便利实用。

归纳以上三点,咱们挑选了 Rocket MQ。

RocketMQ 在同程旅行的落地实践

Rocket MQ 在同程游览的运用场景有削峰、解耦、异步处理以及数据同步等。现在现已在公司各大事务线的核心体系里得到广泛运用,承受了来自微信进口的巨大流量,每天有1000+ 亿条音讯周转。

RocketMQ 在同程旅行的落地实践

同程游览RocketMQ 框架图如上。机票、交通和酒店三大事务线经过 Java SDK 以及Http Proxy 的方法接入到 MQ 集群。其间Http Proxy 首要为了便利其他言语客户端运用;一起为了更好地完成资源阻隔,咱们将后端服务端节点依照事务线做了物理阻隔,能够最大程度地确保事务线之间不会相互影响。整个 MQ 集群经过 MQ 服务平台进行管理。

02 同城双中心

RocketMQ 在同程旅行的落地实践

同城双中心首要为完成以下三个目标:

  • 单机放毛病时确保事务可用
  • 确保数据牢靠
  • 横向扩容

RocketMQ 在同程旅行的落地实践

外部用户恳求经过 LVS 以及 Nginx 调用服务与运用,运用底层首要调用了 MySQL、Redis 以及 MQ,双中心可分为同城冷备和同城双活两个计划。

同城冷备有两个 MQ 集群,分别是 source 集群和target 集群。出产者会将音讯出产到 source 集群,之后经过音讯同步集群将 source 集群里的元数据比方 topic、消费组、音讯等同步给 target 集群。source 集群和 target 集群中的顾客都能够进行消费。

RocketMQ 在同程旅行的落地实践

同城双活咱们建立了跨中心的全局 MQ 集群。用户流量分散到两个中心,每个事务会将出产的音讯往自己中心的 MQ 写。一起,其他服务与运用会从本中心消费所需音讯。

RocketMQ 在同程旅行的落地实践

当呈现单机房 broker 节点毛病时,每组 broker 的两 slave 位于不同机房,至少有一台 slave 具有近乎全量的数据;音讯出产会跨机房到另一个机房,另一个机房的顾客继续消费。

简略对比下,同城冷备计划需求 source 和target 两个集群,因此资源运用率不高,还需求同步 topic 、消费组、消费进展等元数据;同城双活计划资源运用比较合理,事务流量在何处,就在该处进行出产与消费音讯。

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

①就近出产:出产端在A机房,则出产的音讯也存于A机房的 broker。

②就近顾客:顾客在A机房,则顾客音讯也来自A机房的 broker。

③broker 主节点毛病,能够完成主动的选主。

RocketMQ 在同程旅行的落地实践

就近出产与就近消费的核心问题是如何识别客户端与服务端是否在同一机房。识别客户端地点机房能够经过两个途径:

榜首,获取客户端地点IP,然后经过第三方组件解析出 IP 所属机房;

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

RocketMQ 在同程旅行的落地实践

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

榜首,经过 IP 查询,解析IP 段归于哪个机房;

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

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

RocketMQ 在同程旅行的落地实践

就近出产的准则:优先就近出产,就近出产无法满意时则跨机房出产。

假如机房后端的服务节点可用,则出产端会将音讯出产到各自的机房里。假如机房的一切 broker节点都不可用,则出产端会将音讯投递到另一个中心的 broker。

RocketMQ 在同程旅行的落地实践
两个机房消费端都正常的状况下,每个机房的消费端只会消费本机房的音讯。

RocketMQ 在同程旅行的落地实践
如上图,假如idc 2 的消费端悉数毛病,则一切音讯会被另一个机房idc1的消费端消费。

RocketMQ 在同程旅行的落地实践
为了完成就近消费,咱们完成了按机房分配行列算法:

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

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

RocketMQ 在同程旅行的落地实践

毛病切主的完成步骤如下:

榜首步:Nameserver 依据 raft 协议选主;

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

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

第四步:此时出产端无法向旧broker leader发送音讯。假如旧 broker的主节点复生,则会主动切换成从节点。

RocketMQ 在同程旅行的落地实践
Nameserver 元数据体系有一主多从,broker 有一台 master 与两台 slave。假如 master 毛病,则 Nameserver 元数据体系会从 slave1 与 slave2 中依据必定的条件,比方依据同步进展或版别号选出新主,上图为将 slave2 选为主。之后新主会向 nameserver 元数据体系注册,并将版别号+1。假如旧主复生,因会其版别号小于新主版别号被切为 slave。

RocketMQ 在同程旅行的落地实践
在出产环境中实践操作了双中心演练,详细流程如下:

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

RocketMQ 在同程旅行的落地实践
2)15:00左右,将流量回归双中心;

3)15:30左右,又将流量切回一中心。能够清晰地看到,在流量切到一中心时,二中心的音讯出产趋近于0。

整体来看,双中心的演练较成功,完成了音讯的出产跟着流量走。

RocketMQ 在同程旅行的落地实践
简略总结下,双中心计划为跨机房建立了全局MQ集群,出产与消费都恪守优先就近准则,装备一主二从,一主一从音讯写成功即认为音讯写入成功。Nameserver 经过 Raft 协议选主,选完主后会监控每一组里 broker 的 leader 节点。假如 broker 的 leader 节点呈现毛病,则会从这一组剩下的 slave 里选新的主节点。

03 平台管理

平台管理至关重要,能够让环境变得愈加稳定牢靠,呈现异常时能够及时向运用方宣布告警,呈现毛病时能够快速定位。MQ 的平台管理分为主题消费组管理、客户端管理以及服务端管理。

RocketMQ 在同程旅行的落地实践
主题消费组的运用依照先请求后运用的准则,呈现问题时能够依据主题与消费组的请求人找到该主题。MQ 环境分为很多种,能够一键请求一切环境或只约束出产环境的请求,将其他环境的请求放开。关于主题而言,咱们给每一个主题约束了最大出产速度,避免单一主题出产过快从而影响其他主题的出产。

音讯堆积到必定阈值时,能够向事务方宣布告警,告诉其处理;长期不处理能够撤销消费组的消费权限或重置消费进展,避免因音讯大量堆积而影响出产与消费。若消费端节点掉线必定时刻之后没有重新上线,可向事务方快速发布告警,告诉其及时处理。

RocketMQ 在同程旅行的落地实践
客户端管理首要执行一些计算与检测作业,会计算每一条音讯的出产消费耗时、音讯巨细、重复消费的次数。假如出产/消费端版别过低或当时版别存在 bug ,也能够向事务端宣布告诉。

这一系列的计算和检测终究需求为音讯的全链路追踪服务。计算和检测会记录音讯相关信息,包含每一条音讯在哪个时刻点、从哪个事务IP与端口号发送到服务端的哪个节点、于什么时刻被哪些服务的消费端在什么时刻点消费,以及消费耗时、消费的重复次数等信息,能够很便利地排查所需信息。

RocketMQ 在同程旅行的落地实践
服务端管理担任集群的自我维护、集群健康巡检、集群功用巡检和集群高可用。集群的自我维护首要针对出产与消费,尤其是出产的音讯过快或有大量音讯积压时;功用巡检可经过实时发送一批不同巨细的音讯来检测出产和消费的状况;集群的高可用指呈现毛病时,服务平台能及时宣布告诉。

RocketMQ 在同程旅行的落地实践

经过几张图展现下实践的管理,在 MQ 服务平台上,能够请求 topic 和消费组的上线、下线以及权限。

RocketMQ 在同程旅行的落地实践
上图展现了每个集群每分钟的音讯出产消费以及堆积曲线。

RocketMQ 在同程旅行的落地实践
MQ 平台还供给了集群监控的功用,能够检查当时集群 topic 、消费安排数量、音讯的intps、outtps 以及 broker 的数量。一起,能够检查每一台 broker 音讯出产排名以及音讯积压排名,便利毛病时的问题排查。

RocketMQ 在同程旅行的落地实践
运用 Rocket MQ 的过程中,咱们也踩了不少坑。

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

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

3)由于 topic 长度判别不一致导致服务端重启时会丢失少数音讯;

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

04 未来展望

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

RocketMQ 在同程旅行的落地实践

榜首,前史数据归档。很多事务方对数据的反查要求周期较长,而线上出产环境的音讯实践的存储时刻可能只要2-3天,咱们将考虑从前史归档数据里查询;

第二,底层存储剥离,计算与存储别离。现在社区新版别现已支持该能力;

第三,期望利用沉积的前史数据协助事务完成更多数据猜测,比方订单量、退改量等数据的猜测能够更好地协助事务解决问题,一起也能够为事务机器做扩缩容供给支持。

参加 Apache RocketMQ 社区

十年铸剑,Apache RocketMQ 的成长离不开全球接近 500 位开发者的积极参与奉献,相信在下个版别你就是 Apache RocketMQ 的奉献者,在社区不仅能够结识社区大牛,提升技术水平,也能够提升个人影响力,促进自身成长。

社区 5.0 版别正在进行着如火如荼的开发,另外还有接近 30 个 SIG(兴趣小组)等你参加,欢迎立志打造世界级分布式体系的同学参加社区,增加社区开发者微信:rocketmq666 即可进群,参与奉献,打造下一代音讯、事情、流交融处理平台。

RocketMQ 在同程旅行的落地实践

微信扫码增加小火箭进群

另外还能够参加钉钉群与 RocketMQ 爱好者一起广泛讨论:

RocketMQ 在同程旅行的落地实践

钉钉扫码加群