
简介: 随着公司业务的不断发展,流量也在不断增长。我们发现生产中的一些重大事故,往往是被突发的流量冲跨的,对流量的治理和防护,保障系统高可用就尤为重要。
哈啰已进化为包括两轮出行(哈啰单车、哈啰助力车、哈啰电动车、小哈换电)、四轮出行(哈啰顺风车、全网叫车、哈啰打车)等的综合化移动出行平台,并向酒店、到店团购等众多本地生活化生态 探索 。
随着公司业务的不断发展,流量也在不断增长。我们发现生产中的一些重大事故,往往是被突发的流量冲跨的,对流量的治理和防护,保障系统高可用就尤为重要。
本文就哈啰在消息流量和微服务调用的治理中踩过的坑、积累的经验进行分享。
梁勇 ( 老梁 ) ,《 RocketMQ 实战与进阶》专栏联合作者、参与了《 RocketMQ 技术内幕》审稿工作。ArchSummit 全球架构师大会讲师、QCon 案例研习社讲师。
当前主要在后端中间件方向,在公众号瓜农老梁已陆续发表百余篇源码实战类文章,涵盖 RocketMQ 系列、Kafka 系列、GRPC 系列、Nacosl 系列、Sentinel 系列、Java NIO 系列。目前就职于哈啰出行,任职高级技术专家。
开始之前先聊聊治理这件事情,下面是老梁个人理解:
公司之前使用 RabbitMQ ,下面在使用 RabbitMQ 时的痛点,其中很多事故由于 RabbitMQ 集群限流引起的。
曾经有这么一个故障,多个业务共用一个数据库。在一次晚高峰流量陡增,把数据库打挂了。
思考:无论消息还是服务都需要完善的治理措施
哪些是我们的关键指标,哪些是我们的次要指标,这是消息治理的首要问题。
设计目标
旨在屏蔽底层各个中间件( RocketMQ / Kafka )的复杂性,通过唯一标识动态路由消息。同时打造集资源管控、检索、监控、告警、巡检、容灾、可视化运维等一体化的消息治理平台,保障消息中间件平稳 健康 运行。
把复杂的问题搞简单,那是能耐。
极简统一 API
提供统一的 SDK 封装了( Kafka / RocketMQ )两种消息中间件。
主题消费组自动创建不适合生产环境,自动创建会导致失控,不利于整个生命周期管理和集群稳定。需要对申请流程进行控制,但是应尽可能简单。例如:一次申请各个环境均生效、生成关联告警规则等。
监控客户端使用是否规范,找到合适的措施治理
场景一 瞬时流量与集群的流控
假设现在集群 Tps 有 1 万,瞬时翻到 2 万甚至更多,这种过度陡增的流量极有可能引发集群流控。针对这类场景需监控客户端的发送速度,在满足速度和陡增幅度阈值后将发送变的平缓一些。
场景二 大消息与集群抖动
当客户端发送大消息时,例如:发送几百KB甚至几兆的消息,可能造成 IO 时间过长与集群抖动。针对这类场景治理需监控发送消息的大小,我们采取通过事后巡检的方式识别出大消息的服务,推动使用同学压缩或重构,消息控制在 10KB 以内。
场景三 过低客户端版本
随着功能的迭代 SDK 的版本也会升级,变更除了功能外还有可能引入风险。当使用过低的版本时一个是功能不能得到支持,另外一个是也可能存在安全隐患。为了解 SDK 使用情况,可以采取将 SDK 版本上报,通过巡检的方式推动使用同学升级。
场景四 消费流量摘除和恢复
消费流量摘除和恢复通常有以下使用场景,第一个是发布应用时需要先摘流量,另外一个是问题定位时希望先把流量摘除掉再去排查。为了支持这种场景,需要在客户端监听摘除/恢复事件,将消费暂停和恢复。
场景五 发送/消费耗时检测
发送/消费一条消息用了多久,通过监控耗时情况,巡检摸排出性能过低的应用,针对性推动改造达到提升性能的目的。
场景六 提升排查定位效率
在排查问题时,往往需要检索发了什么消息、存在哪里、什么时候消费的等消息生命周期相关的内容。这部分可以通过 msgId 在消息内部将生命周期串联起来。另外是通过在消息头部埋入 rpcId / traceId 类似链路标识,在一次请求中将消息串起来。
需要的监控信息
常用治理措施
监控主题消费组资源使用情况
场景一 消费积压对业务的影响
有些业务场景对消费堆积很敏感,有些业务对积压不敏感,只要后面追上来消费掉即可。例如单车开锁是秒级的事情,而信息汇总相关的批处理场景对积压不敏感。通过采集消费积压指标,对满足阈值的应用采取实时告警的方式通知到应用负责的同学,让他们实时掌握消费情况。
场景二 消费/发送速度的影响
发送/消费速度跌零告警?有些场景速度不能跌零,如果跌零意味着业务出现异常。通过采集速度指标,对满足阈值的应用实时告警。
场景三 消费节点掉线
消费节点掉线需要通知给应用负责的同学,这类需要采集注册节点信息,当掉线时能实时触发告警通知。
场景四 发送/消费不均衡
发送/消费的不均衡往往影响其性能。记得有一次咨询时有同学将发送消息的key设置成常量,默认按照 key 进行 hash 选择分区,所有的消息进入了一个分区里,这个性能是无论如何也上不来的。另外还要检测各个分区的消费积压情况,出现过度不均衡时触发实时告警通知。
需要的监控信息
常用治理措施
度量集群 健康 的核心指标有哪些?
场景一 集群 健康 检测
集群 健康 检测回答一个问题:这个集群是不是好的。通过检测集群节点数量、集群中每个节点心跳、集群写入Tps水位、集群消费Tps水位都是在解决这个问题。
场景二 集群的稳定性
集群流控往往体现出集群性能的不足,集群抖动也会引发客户端发送超时。通过采集集群中每个节点心跳耗时情况、集群写入Tps水位的变化率来掌握集群是否稳定。
场景三 集群的高可用
高可用主要针对极端场景中导致某个可用区不可用、或者集群上某些主题和消费组异常需要有一些针对性的措施。例如:MQ 可以通过同城跨可用区主从交叉部署、动态将主题和消费组迁移到灾备集群、多活等方式进行解决。
需要的监控信息
常用治理措施
如果说这些关键指标中哪一个最重要?我会选择集群中每个节点的心跳检测,即:响应时间( RT ),下面看看影响 RT 可能哪些原因。
我们总会遇到坑,遇到就把它填了。
RocketMQ 从节点、主节点频繁 CPU 飙高,很明显的毛刺,很多次从节点直接挂掉了。
只有系统日志有错误提示
2020-03-16T17:56:07505715+08:00 VECS0xxxx kernel:[] __alloc_pages_nodemask+0x7e1/0x9602020-03-16T17:56:07505717+08:00 VECS0xxxx kernel: java: page allocation failure order:0, mode:0x202020-03-16T17:56:07505719+08:00 VECS0xxxx kernel: Pid: 12845, comm: java Not tainted 2632-754171el6x86_64 #12020-03-16T17:56:07505721+08:00 VECS0xxxx kernel: Call Trace:2020-03-16T17:56:07505724+08:00 VECS0xxxx kernel:[] __alloc_pages_nodemask+0x7e1/0x9602020-03-16T17:56:07505726+08:00 VECS0xxxx kernel: [] dev_queue_xmit+0xd0/0x3602020-03-16T17:56:07505729+08:00 VECS0xxxx kernel: [] ip_finish_output+0x192/0x3802020-03-16T17:56:07505732+08:00 VECS0xxxx kernel: []
各种调试系统参数只能减缓但是不能根除,依然毛刺超过 50%
将集群所有系统升级从 centos 6 升级到 centos 7 ,内核版本也从从 26 升级到 310 ,CPU 毛刺消失。
RocketMQ 社区版默认本支持 18 个延迟级别,每个级别在设定的时间都被会消费者准确消费到。为此也专门测试过消费的间隔是不是准确,测试结果显示很准确。然而,如此准确的特性居然出问题了,接到业务同学报告线上某个集群延迟消息消费不到,诡异!
将" delayOffsetjson "和" consumequeue / SCHEDULE_TOPIC_XXXX "移到其他目录,相当于删除;逐台重启 broker 节点。重启结束后,经过验证,延迟消息功能正常发送和消费。
哪些是我们的核心服务,哪些是我们的非核心服务,这是服务治理的首要问题
服务能应对突如其来的陡增流量,尤其保障核心服务的平稳运行。
根据用户和业务影响两个纬度来进行评估设定的,将应用分成了四个等级。
S1:核心产品,产生故障会引起外部用户无法使用或造成较大资损,比如主营业务核心链路,如单车、助力车开关锁、顺风车的发单和接单核心链路,以及其核心链路强依赖的应用。
S2: 不直接影响交易,但关系到前台业务重要配置的管理与维护或业务后台处理的功能。
S3: 服务故障对用户或核心产品逻辑影响非常小,且对主要业务没影响,或量较小的新业务;面向内部用户使用的重要工具,不直接影响业务,但相关管理功能对前台业务影响也较小。
S4: 面向内部用户使用,不直接影响业务,或后续需要推动下线的系统。
S1 服务是公司的核心服务,是重点保障的对象,需保障其不被非核心服务流量意外冲击。
中国政府机构的低效不仅在国内人人皆知,在世界范围内也是有名的。
美国《时代周刊》曾经写了一篇文章《中国式效率只是个传说》,说中国政府虽然在很多大的政策制定上高效异常,但在具体的执行层面则官
僚主义盛行,“无尽地等待各种许可和证书,奇奇怪怪又含糊不清的规章制度,动不动就突然改变的办事流程……就连小公司都不得不专门指派一个人,什么事都不做,专心和政府部门打交道”。
在世界银行的《全球治理指标报告》中,中国政府的效率从1996年以来,都一直在世界排名的中位数徘徊,直到2014年才突然有了大的进步,但也只是在全球参与排名的212个国家中排名第140。中国的政府部门在财政支出上的大量消耗与人员上的冗杂超过世界其它国家,但在行政职能上却远远落后。
政府作为提供公共服务的唯一的、非市场机构,本质上处于垄断地位,不存在替代性,自然也不存在竞争压力,没有提高效率的动力。而中国政府部门把这一特点发挥到了极致,并有效利用起来。政府更重要的作用是维护国家的稳定和发展,而非人民的幸福生活。这一点在政府官员的政绩考核机制中就明显地表现出来:经济发展往往是最核心的衡量指标,最多顺应时代附带一些环境保护、能源消耗、社会治安、公共教育的议题,但人民满意度却常常是最不重要的那一个。
除了官员的政绩考核标准,普通公务员的的晋升机制也决定了政府部门的长期低效。
1993年建立的公务员制度,至今也才23年,但其中系统的晋升黑幕已经到了一个众所周知的地步。根据《公务员法》,中国公务员的晋升包括两个方面:职务晋升和职级晋升;前者是权力地位的提高,后者是薪
资待遇的提高。然而职务晋升和职级晋升却是挂钩的,公务员想要加薪必须先升职。然而,中国公务员在职人员中,超过60%的人在乡镇两级基层,而中国公务员中从科级到县处级干部的升迁比例仅为44%,从县处级升为厅局级的比例是1%。严重的僧多粥少、升职加薪无望使基层的公务员容易陷入一个消极怠工的状态。
尽管2015年11月下发了《关于县以下机关建立公务员职务与职级并行制度的意见》,决定把公务员的职务晋升与职级晋升独立开,让职位低的基层员工也能通过努力获取可观的薪水。且不说这个制度改革真正实施起来困难重重,在权力决定话语权的政府体系中,高薪低职对于个人来说只会带来更多现实的麻烦。而即便一切顺利,由于公务员考核内容本身的缺陷,拿到高薪的政府人员也并不一定会把精力用在提高实际业务效率上。
公务员的考核内容没有将单位业务绩效与个人的工作绩效挂钩,个人利益和提供公共服务的质量并没有太大关系。不同的部门、不同的类别、不同的层次的工作人员都有不同的考核体系,但大多分为五个概括部分:德、能、勤、绩、廉。德是指遵纪守法、尊重领导、顾全大局;能是指学习技能,提高各种业务水平;勤是指勤奋工作;绩是指工作成果的表现;廉是指廉洁自律。这样的考核标准就已经决定了公务人员的职业发展方向,而晋升的最终决定权还放在上级领导手中,更进一步降低了效率对公务员的重要性。
它们塑造出来的标准公务员形象是安分守己的刻板执行者,他们不需要结果导向地解决问题,只需要按照上级指示一步步完成任务就好;即便出了什么问题,只要他们是跟着指示、跟着正确流程走的,就不需要承担什么责任——最后总会有“手续繁琐”、“衔接不畅”等各种大而化之的理由来帮他们开脱。
一方面是个人不需要为效率负责,另一方面是也没有人盯着他们对他们问责。
几十年前的计划经济体制下,形成了“无限政府”、“全能政府”的管理模式:政府制定规则、执行规则、监督规则;政府包揽一切,无人可以监管或制衡它;它却可以随意插手到经济社会生活中去。这种现象维持至今,导致政府机构庞大、社会化程度低、人浮于事。全能政府中的官员并没有太多成本意识和服务意识,他们一方面盲目追求政绩导致成本增加,另一方面缺乏改进的动力,长期低效率运转,却并没有人来制约它们。
商标局的这次行为就是典型的“全能政府”作风:大半年没有发放商标注册证的原因是没有纸,这既透露出部门运转效率的极度低下,也表现出他们责任意识和服务意识基本为零;同时,出现了这样严重的失职却无人监管,群众投诉无门,直等到媒体曝光才受到关注,而即便在引来全社会的讨论和谴责后,也没有人被问责或对利益受损者进行弥补,而是轻描淡写地致歉后才开始恢复早就该履行的职责。
以上就是关于RocketMQ 千锤百炼哈啰在分布式消息治理和微服务治理中的实践全部的内容,包括:RocketMQ 千锤百炼哈啰在分布式消息治理和微服务治理中的实践、为什么行政机构效率低、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)