背景介绍

哈啰已进化为包括两轮出行(哈啰单车、哈啰助力车、哈啰电动车、小哈换电)、四轮出行(哈啰顺风车、全网叫车、哈啰打车)等的综合化移动出行平台,并向酒店、到店团购等众多本地生活化生态探索。

随着公司业务的不断发展,流量也在不断增长。我们发现生产中的一些重大事故,往往是被突发的流量冲跨的,对流量的治理和防护,保障系统高可用就尤为重要。

本文为就哈啰在消息流量和微服务调用的治理中踩过的坑、积累的经验一个分享。

作者介绍

梁勇 ( 老梁 ) ,《 RocketMQ 实战与进阶》专栏联合作者、参与了《 RocketMQ 技术内幕》审稿工作。ArchSummit 全球架构师大会讲师、QCon 案例研习社讲师。

当前主要在后端中间件方向,在公众号【瓜农老梁】已陆续发表百余篇源码实战类文章,涵盖 RocketMQ 系列、Kafka 系列、GRPC 系列、Nacosl 系列、Sentinel 系列、Java NIO 系列。目前就职于哈啰出行,任职高级技术专家。

聊聊治理这件事

开始之前先聊聊治理这件事情,下面是老梁个人理解:

治理在干一件什么事?

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

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

  • 以往经验

  • 用户反馈

  • 业内对比

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

  • 监控跟踪

  • 告警通知

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

  • 治理措施

  • 应急方案

目录

  • 打造分布式消息治理平台

  • RocketMQ实战踩坑和解决

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

背景

裸奔的RabbitMQ

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

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

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

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

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

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

裸奔的服务

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

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

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

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

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

01 打造分布式消息治理平台

设计指南

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

设计目标

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

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

  • 提供简单易用API

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

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

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

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

尽可能简单易用

设计指南

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

极简统一API

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

一次申请

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

客户端治理

设计指南

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

场景回放

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

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

场景二 大消息与集群抖动

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

场景三 过低客户端版本

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

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

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

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

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

场景六 提升排查定位效率

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

治理措施提炼

需要的监控信息

  • 发送/消费速度

  • 发送/消费耗时

  • 消息大小

  • 节点信息

  • 链路标识

  • 版本信息

常用治理措施

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

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

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

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

主题/消费组治理

设计指南

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

场景回放

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

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

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

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

场景三 消费节点掉线

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

场景四 发送/消费不均衡

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

治理措施提炼

需要的监控信息

  • 发送/消费速度

  • 发送分区详情

  • 消费各分区积压

  • 消费组积压

  • 注册节点信息

常用治理措施

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

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

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

集群健康治理

设计指南

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

场景回放

场景一  集群健康检测

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

场景二 集群的稳定性

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

场景三 集群的高可用

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

治理措施提炼

需要的监控信息

  • 集群节点数量采集

  • 集群节点心跳耗时

  • 集群写入Tps的水位

  • 集群消费Tps的水位

  • 集群写入Tps的变化率

常用治理措施

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

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

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

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

最核心指标聚焦

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

关于告警

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

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

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

消息平台图示

架构图

看板图示

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

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

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

行动指南

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

RocketMQ集群CPU毛刺

问题描述

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

只有系统日志有错误提示

2020-03-16T17:56:07.505715+08:00 VECS0xxxx kernel: <IRQ>  [<ffffffff81143c31>] ? __alloc_pages_nodemask+0x7e1/0x960
2020-03-16T17:56:07.505717+08:00 VECS0xxxx kernel: java: page allocation failure. order:0, mode:0x20
2020-03-16T17:56:07.505719+08:00 VECS0xxxx kernel: Pid: 12845, comm: java Not tainted 2.6.32-754.17.1.el6.x86_64 #1
2020-03-16T17:56:07.505721+08:00 VECS0xxxx kernel: Call Trace:
2020-03-16T17:56:07.505724+08:00 VECS0xxxx kernel: <IRQ>  [<ffffffff81143c31>] ? __alloc_pages_nodemask+0x7e1/0x960
2020-03-16T17:56:07.505726+08:00 VECS0xxxx kernel: [<ffffffff8148e700>] ? dev_queue_xmit+0xd0/0x360
2020-03-16T17:56:07.505729+08:00 VECS0xxxx kernel: [<ffffffff814cb3e2>] ? ip_finish_output+0x192/0x380
2020-03-16T17:56:07.505732+08:00 VECS0xxxx kernel: [<ffffffff811862e2>] ?

各种调试系统参数只能减缓但是不能根除,依然毛刺超过50%

解决方案

将集群所有系统升级从centos6升级到centos7,内核版本也从从2.6升级到3.10,CPU毛刺消失。

RocketMQ集群线上延迟消息失效

问题描述

RocketMQ社区版默认本支持18个延迟级别,每个级别在设定的时间都被会消费者准确消费到。为此也专门测试过消费的间隔是不是准确,测试结果显示很准确。然而,如此准确的特性居然出问题了,接到业务同学报告线上某个集群延迟消息消费不到,诡异!

解决方案

将"delayOffset.json"和"consumequeue/SCHEDULE_TOPIC_XXXX"移到其他目录,相当于删除;逐台重启broker节点。重启结束后,经过验证,延迟消息功能正常发送和消费。

深入研究 RocketMQ 源码为治理保驾护航

阅读源码有啥用?

  • 遇到问题不慌

  • 解决问题有思路

  • 能够链接到一些专业同学一起探讨

  • 为技术方案的设计提供素材

  • 知行合一(源码+实战)

‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍03 打造微服务高可用治理平台

设计指南

哪些是我们的核心服务,哪些是我们的非核心服务,这是服务治理的首要问题

设计目标

服务能应对突如其来的陡增流量,尤其保障核心服务的平稳运行。

应用分级和分组部署

应用分级

根据用户和业务影响两个纬度来进行评估设定的,将应用分成了四个等级。

  • 业务影响:应用故障时影响的业务范围

  • 用户影响:应用故障时影响的用户数量

S1:核心产品,产生故障会引起外部用户无法使用或造成较大资损,比如主营业务核心链路,如单车、助力车开关锁、顺风车的发单和接单核心链路,以及其核心链路强依赖的应用。

S2:  不直接影响交易,但关系到前台业务重要配置的管理与维护或业务后台处理的功能。

S3:  服务故障对用户或核心产品逻辑影响非常小,且对主要业务没影响,或量较小的新业务;面向内部用户使用的重要工具,不直接影响业务,但相关管理功能对前台业务影响也较小。

S4:  面向内部用户使用,不直接影响业务,或后续需要推动下线的系统。

分组部署

S1服务是公司的核心服务,是重点保障的对象,需保障其不被非核心服务流量意外冲击。

  • S1服务分组部署,分为Stable和Standalone两套环境

  • 非核心服务调用S1服务流量路由到Standalone环境

  • S1服务调用非核心服务需配置熔断策略

多种限流熔断能力建设

我们建设的高可用平台能力

部分限流效果图

  • 预热图示

  • 排队等待

  • 预热+排队

高可用平台图示

  • 中间件全部接入

  • 动态配置实时生效

  • 每个资源和IP节点详细流量

总结

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

  • 哪些是我们的核心服务,哪些是我们的非核心服务,这是服务治理的首要问题

  • 源码&实战 是一种比较好的工作学习方法

精彩文章推荐:

  • 微服务下,接口性能优化的一些总结

  • 没做性能优化,系统说炸就炸...

  • 蚂蚁集团技术专家山丘:性能优化常见压测模型及优缺点

  • 蚂蚁集团技术专家山丘:性能优化的常见模式及趋势

  • 大神手把手教你Java性能优化-江南白衣(加强版)

架构专家梁勇:哈啰在分布式消息治理和微服务治理中的实践相关推荐

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

    作者|梁勇 ​ 背景 ​ 哈啰已进化为包括两轮出行(哈啰单车.哈啰助力车.哈啰电动车.小哈换电).四轮出行(哈啰顺风车.全网叫车.哈啰打车)等的综合化移动出行平台,并向酒店.到店团购等众多本地生活化生 ...

  2. 哈啰在分布式消息治理和微服务治理中的实践

    简介:随着公司业务的不断发展,流量也在不断增长.我们发现生产中的一些重大事故,往往是被突发的流量冲跨的,对流量的治理和防护,保障系统高可用就尤为重要. 作者|梁勇 ​ 背景 ​ 哈啰已进化为包括两轮出 ...

  3. 资深架构专家讲解微服务治理的架构演进

    摘要:随着业务的发展,规模扩大,服务越来越多,需要协调线上运行的各个服务,保障服务的SLA;基于服务调用的性能KPI数据进行容量管理,合理分配各服务的资源占用;对故障业务做服务降级.流量控制.流量迁移 ...

  4. 分布式服务框架原理与实践pdf_深度解析微服务治理的技术演进和架构实践

    为什么需要服务治理? 第一.业务需求 随着业务的发展,服务越来越多,如何协调线上运行的各个服务,保障服务的SLA,对服务架构和运维人员是一个很大的挑战.随着业务规模的不断扩大,小服务资源浪费等问题逐渐 ...

  5. 一行代码,保障分布式事务一致性—GTS:微服务架构下分布式事务解决方案

    摘要: 虽然微服务现在如火如荼,但对其实践其实仍处于初级阶段.即使互联网巨头的实践也大多是试验层面,鲜有核心业务系统微服务化的案例.GTS是目前业界第一款,也是唯一的一款通用的解决微服务分布式事务问题 ...

  6. (五):C++分布式实时应用框架——微服务架构的演进

    C++分布式实时应用框架--微服务架构的演进 技术交流合作QQ群:436466587 欢迎讨论交流 上一篇:(四):C++分布式实时应用框架--状态中心模块 版权声明:本文版权及所用技术归属smart ...

  7. 微服务开发中的数据架构设计

    前言 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性,可以实现业务之间的松耦合.业务的灵活调整组合以及系统的高可用性.为业务创新和业务持续提供了一个良好的基 ...

  8. Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲

    Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台:   微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...

  9. 微服务开发中的数据架构设计 1

    GitChat 作者:陈伟荣 原文:微服务开发中的数据架构设计 关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术 [不要错过文末彩蛋] 前言 微服务是当前非常流行的技术框架,通过服务的小 ...

最新文章

  1. 更改centos 5 yum源
  2. python【数据结构与算法】最短路算法之FloyedDijkstra
  3. codeforces-73C. LionAge II
  4. 分享:一个简单的线程池的实现
  5. [mmu/cache]-cache在linux和optee中的应用-InProgress
  6. 【错误解决】[Maven] cannot be opened because it does not exist错误[文件无法编译到target目录下的解决方法]...
  7. 有这些好习惯,可以让你悄悄变优秀
  8. debian apache php mysql,Debian下配置APACHE2+MYSQL5+PHP5
  9. Minikube-运行在笔记本上的Kubernetes集群
  10. 谷歌披露利用 Windows 和安卓双平台的高阶攻击活动
  11. ES6 中 class 和 extends 的es5实现
  12. 如何制作一款HTML5 RPG游戏引擎——第一篇,地图类的实现
  13. cad画固定长度的弧线_CAD绘制指定长度的圆弧的2种方法
  14. zzuli:1047对数表
  15. CentOS6.5 开启防火墙iptables端口,如3306,8080
  16. 微信小程序 短信验证 功能的实现(附案例代码/前后端/直接用)
  17. 爆销产品标题怎么写_抖音爆火标题文案模板
  18. 学术论文写作之引言(Introduction)怎么写
  19. Java全栈学习路线-拭去心尘
  20. 极光短信在程序中(JAVA)的使用

热门文章

  1. query.exec报QSqlQuery::exec: database not open
  2. 注意html的语言编码charset,HTML编码
  3. 讯飞智能录音笔SR101:考研的温暖陪伴
  4. mfc socket onreceive函数不被调用_不报错地调用空指针类的成员函数
  5. 高频面试题1:自增边量
  6. java多线程模拟loadrunner进行压测
  7. 操作系统之进程管理:7、进程同步、进程互斥
  8. 【数据库题型大总结】名词解释总结
  9. (软件工程复习核心重点)第三章需求分析-第一节:需求分析相关概念
  10. 【计算机就业-后端开发工程师】校招想去互联网公司担任后端开发工程师该怎么准备