RocketMQ 千锤百炼--哈啰在分布式消息治理和微服务治理中的实践

本文探讨了在IT环境中建立分布式消息治理平台的重要性,以RocketMQ为例,讲述了在实践中遇到的问题,如RabbitMQ集群限流、服务故障、流量管理等,并提供了设计指南、监控指标和治理措施,以确保消息中间件的稳定和高效运行。
摘要由CSDN通过智能技术生成

治理在干一件什么事?

  • 让我们的环境变得美好一些

需要知道哪些地方还不够好?

  • 以往经验

  • 用户反馈

  • 业内对比

还需要知道是不是一直都是好的?

  • 监控跟踪

  • 告警通知

不好的时候如何再让其变好?

  • 治理措施

  • 应急方案

目录

  1. 打造分布式消息治理平台

  2. RocketMQ 实战踩坑和解决

  3. 打造微服务高可用治理平台

背景

裸奔的 RabbitMQ

公司之前使用 RabbitMQ ,下面在使用 RabbitMQ 时的痛点,其中很多事故由于 RabbitMQ 集群限流引起的。

  • 积压过多是清理还是不清理?这是个问题,我再想想。

  • 积压过多触发集群流控?那是真的影响业务了。

  • 想消费前两天的数据?请您重发一遍吧。

  • 要统计哪些服务接入了?您要多等等了,我得去捞IP看看。

  • 有没有使用风险比如大消息?这个我猜猜。

裸奔的服务

曾经有这么一个故障,多个业务共用一个数据库。在一次晚高峰流量陡增,把数据库打挂了。

  • 数据库单机升级到最高配依然无法解决

  • 重启后缓一缓,不一会就又被打挂了

  • 如此循环着、煎熬着、默默等待着高峰过去

思考:无论消息还是服务都需要完善的治理措施

打造分布式消息治理平台

================================================================================

设计指南

哪些是我们的关键指标,哪些是我们的次要指标,这是消息治理的首要问题。

设计目标

旨在屏蔽底层各个中间件( RocketMQ / Kafka )的复杂性,通过唯一标识动态路由消息。同时打造集资源管控、检索、监控、告警、巡检、容灾、可视化运维等一体化的消息治理平台,保障消息中间件平稳健康运行。

消息治理平台设计需要考虑的点

  • 提供简单易用 API

  • 有哪些关键点能衡量客户端的使用没有安全隐患

  • 有哪些关键指标能衡量集群健康不健康

  • 有哪些常用的用户/运维操作将其可视化

  • 有哪些措施应对这些不健康

======================================================================

尽可能简单易用


设计指南

把复杂的问题搞简单,那是能耐。

极简统一 API

提供统一的 SDK 封装了( Kafka / RocketMQ )两种消息中间件。

1.png

一次申请

主题消费组自动创建不适合生产环境,自动创建会导致失控,不利于整个生命周期管理和集群稳定。需要对申请流程进行控制,但是应尽可能简单。例如:一次申请各个环境均生效、生成关联告警规则等。

2.png

客户端治理


设计指南

监控客户端使用是否规范,找到合适的措施治理

场景回放

场景一 瞬时流量与集群的流控

假设现在集群 Tps 有 1 万,瞬时翻到 2 万甚至更多,这种过度陡增的流量极有可能引发集群流控。针对这类场景需监控客户端的发送速度,在满足速度和陡增幅度阈值后将发送变的平缓一些。

场景二 大消息与集群抖动

当客户端发送大消息时,例如:发送几百KB甚至几兆的消息,可能造成 IO 时间过长与集群抖动。针对这类场景治理需监控发送消息的大小,我们采取通过事后巡检的方式识别出大消息的服务,推动使用同学压缩或重构,消息控制在 10KB 以内。

场景三 过低客户端版本

随着功能的迭代 SDK 的版本也会升级,变更除了功能外还有可能引入风险。当使用过低的版本时一个是功能不能得到支持,另外一个是也可能存在安全隐患。为了解 SDK 使用情况,可以采取将 SDK 版本上报,通过巡检的方式推动使用同学升级。

场景四 消费流量摘除和恢复

消费流量摘除和恢复通常有以下使用场景,第一个是发布应用时需要先摘流量,另外一个是问题定位时希望先把流量摘除掉再去排查。为了支持这种场景,需要在客户端监听摘除/恢复事件,将消费暂停和恢复。

场景五 发送/消费耗时检测

发送/消费一条消息用了多久,通过监控耗时情况,巡检摸排出性能过低的应用,针对性推动改造达到提升性能的目的。

场景六 提升排查定位效率

在排查问题时,往往需要检索发了什么消息、存在哪里、什么时候消费的等消息生命周期相关的内容。这部分可以通过 msgId 在消息内部将生命周期串联起来。另外是通过在消息头部埋入 rpcId / traceId 类似链路标识,在一次请求中将消息串起来。

治理措施提炼

需要的监控信息

  • 发送/消费速度

  • 发送/消费耗时

  • 消息大小

  • 节点信息

  • 链路标识

  • 版本信息

常用治理措施

  • 定期巡检:有了埋点信息可以通过巡检将有风险的应用找出来。例如发送/消费耗时大于 800 ms、消息大小大于 10 KB、版本小于特定版本等。

  • 发送平滑:例如检测到瞬时流量满足 1 万而且陡增了 2 倍以上,可以通过预热的方式将瞬时流量变的平滑一些。

  • 消费限流:当第三方接口需要限流时,可以对消费的流量进行限流,这部分可以结合高可用框架实现。

  • 消费摘除:通过监听摘除事件将消费客户端关闭和恢复。

主题/消费组治理


设计指南

监控主题消费组资源使用情况

场景回放

场景一 消费积压对业务的影响

有些业务场景对消费堆积很敏感,有些业务对积压不敏感,只要后面追上来消费掉即可。例如单车开锁是秒级的事情,而信息汇总相关的批处理场景对积压不敏感。通过采集消费积压指标,对满足阈值的应用采取实时告警的方式通知到应用负责的同学,让他们实时掌握消费情况。

场景二 消费/发送速度的影响

发送/消费速度跌零告警?有些场景速度不能跌零,如果跌零意味着业务出现异常。通过采集速度指标,对满足阈值的应用实时告警。

场景三 消费节点掉线

消费节点掉线需要通知给应用负责的同学,这类需要采集注册节点信息,当掉线时能实时触发告警通知。

场景四 发送/消费不均衡

发送/消费的不均衡往往影响其性能。记得有一次咨询时有同学将发送消息的key设置成常量,默认按照 key 进行 hash 选择分区,所有的消息进入了一个分区里,这个性能是无论如何也上不来的。另外还要检测各个分区的消费积压情况,出现过度不均衡时触发实时告警通知。

治理措施提炼

需要的监控信息

  • 发送/消费速度

  • 发送分区详情

  • 消费各分区积压

  • 消费组积压

  • 注册节点信息

常用治理措施

  • 实时告警:对消费积压、发送/消费速度、节点掉线、分区不均衡进行实时告警通知。

  • 提升性能:对于有消费积压不能满足需求,可以通过增加拉取线程、消费线程、增加分区数量等措施加以提升。

  • 自助排查:提供多维度检索工具,例如通过时间范围、msgId 检索、链路系统等多维度检索消息生命周期。

集群健康治理


设计指南

度量集群健康的核心指标有哪些?

场景回放

场景一 集群健康检测

集群健康检测回答一个问题:这个集群是不是好的。通过检测集群节点数量、集群中每个节点心跳、集群写入Tps水位、集群消费Tps水位都是在解决这个问题。

场景二 集群的稳定性

集群流控往往体现出集群性能的不足,集群抖动也会引发客户端发送超时。通过采集集群中每个节点心跳耗时情况、集群写入Tps水位的变化率来掌握集群是否稳定。

场景三 集群的高可用

高可用主要针对极端场景中导致某个可用区不可用、或者集群上某些主题和消费组异常需要有一些针对性的措施。例如:MQ 可以通过同城跨可用区主从交叉部署、动态将主题和消费组迁移到灾备集群、多活等方式进行解决。

治理措施提炼

需要的监控信息

  • 集群节点数量采集

  • 集群节点心跳耗时

  • 集群写入 Tps 的水位

  • 集群消费 Tps 的水位

  • 集群写入 Tps 的变化率

常用治理措施

  • 定期巡检:对集群 Tps 水位、硬件水位定期巡检。

  • 容灾措施:同城跨可用区主从交叉部署、容灾动态迁移到灾备集群、异地多活。

  • 集群调优:系统版本/参数、集群参数调优。

  • 集群分类:按业务线分类、按核心/非核心服务分类。

最核心指标聚焦

如果说这些关键指标中哪一个最重要?我会选择集群中每个节点的心跳检测,即:响应时间( RT ),下面看看影响 RT 可能哪些原因。

3.png

关于告警

  • 监控指标大多是秒级探测

  • 触发阈值的告警推送到公司统一告警系统、实时通知

  • 巡检的风险通知推送到公司巡检系统、每周汇总通知

消息平台图示

架构图

4.png

看板图示

  • 多维度:集群维度、应用维度

  • 全聚合:关键指标全聚合

5.png

6.png

RocketMQ 实战中踩过的坑和解决方案

==========================================================================================

行动指南

我们总会遇到坑,遇到就把它填了。

1. RocketMQ 集群 CPU 毛刺

问题描述

**

RocketMQ 从节点、主节点频繁 CPU 飙高,很明显的毛刺,很多次从节点直接挂掉了。

7.png

只有系统日志有错误提示

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

复习的面试资料

这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)

  • 第一部分:Java基础-中级-高级

image

  • 第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)

image

  • 第三部分:性能调优(JVM+MySQL+Tomcat)

image

  • 第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)

image

  • 第五部分:微服务(SpringBoot+SpringCloud+Dubbo)

image

  • 第六部分:其他:并发编程+设计模式+数据结构与算法+网络

image

进阶学习笔记pdf

  • Java架构进阶之架构筑基篇(Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法

image

  • Java架构进阶之开源框架篇(设计模式+Spring+SpringMVC+MyBatis

image

image

image

  • Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)

image

image

image

  • Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

image

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
数据结构与算法**)**

[外链图片转存中…(img-n6p5kE6k-1713379718526)]

  • Java架构进阶之开源框架篇(设计模式+Spring+SpringMVC+MyBatis

[外链图片转存中…(img-z6Gh5GnB-1713379718526)]

[外链图片转存中…(img-qBN8Spxm-1713379718526)]

[外链图片转存中…(img-Ffwq5Nip-1713379718527)]

  • Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)

[外链图片转存中…(img-qUg6rL2F-1713379718527)]

[外链图片转存中…(img-oUUROX4G-1713379718527)]

[外链图片转存中…(img-NmrwrTB4-1713379718527)]

  • Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

[外链图片转存中…(img-nArlEnNB-1713379718528)]

[外链图片转存中…(img-dPnFOX7J-1713379718528)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值