美团外卖自动化业务运维系统建设

美团外卖业务在互联网行业是非常独特的,不仅流程复杂——从用户下单、商家接单到配送员接单、交付,而且压力和流量在午、晚高峰时段非常集中。同时,外卖业务的增长非常迅猛,自2013年11月上线到最近峰值突破1600万,还不到4年。在这种情况下,一旦出现事故,单纯靠人工排查解决问题,存在较多的局限性。本文将详细解析问题发现、根因分析、问题解决等自动化运维体系的建设历程与相关设计原则。

首先从业务本身具有的一些特点来讲一下自动化业务运维的必要性。

业务流程复杂

图1 用户角度的美团外卖技术体系

美团外卖的定位是“围绕在线商品交易与及时送达的O2O电商交易平台”。图1就是用户在使用美团外卖App过程中涉及到的技术模块,历经用户下单–>系统发给商家–>商家准备外卖–>配送,到最后用户收到商品比如热乎乎的盒饭,整个过程的时间需要控制在半小时之内。在这背后,整个产品线上还会涉及很多数据分析、统计、结算、合同等各个端的交互,因此,对一致性的要求高,同时并发量也很高。

每日流量陡增明显

图2 美团外卖常规业务监控图

外卖业务每天在特定时刻流量陡增明显,有的时候还会和第三方做一些活动会造成系统流量瞬间达到午高峰的2~3倍,如图2所示。

业务增长迅猛

图3 美团外卖重要成长里程碑

美团外卖自2013年上线至2017年10月份,在不到4年的时间里,日提单已达2000万,日完成订单突破1600万,如图3所示。这期间,业务产品一直处在高速迭代的过程中,某些数据访问的服务量会达到日均120亿+次,QPS近40万。现在如果在午高峰出现一个小小的事故,就会造成比较大的损失。

综上所述,我们需要帮助开发人员准确地定位问题和快速解决问题。

图4 开发人员日常监控痛点

我们在日常的业务运维工作中经常会碰到一些问题困扰着开发人员,如图4所示,主要有四大痛点:

① 各种维度的事件通知、报警事件充斥着开发人员的IM,我们需要花很多精力去配置和优化报警阈值、报警等级才不会出现很多误报。我们希望可以将各种服务的报警指标和阈值标准化、自动化,然后自动收集这些事件进行统计。一方面可以帮助开发人员提前发现问题潜在的风险,另一方面为我们找出问题的根本原因提供有力的数据支持。

② 公司有多套监控系统,它们有各自的职责定位,但是互相没有关联,所以开发人员在排查问题时需要带着参数在不同的系统之间切换,这就降低了定位问题的效率。

③ 我们的代码中会有大量的降级限流开关,在服务异常时进行相应的保护操作。这些开关随着产品快速地迭代,我们并不能确定它们是否还有效。另外,我们需要较准确地进行容量规划以应对快速增长的业务量。这些都需要通过全链路压测帮我们不断地验证,并发现性能瓶颈,有效地评估服务容量。

④ 开发人员收到各种报警之后,通常都会根据自己的经验进行问题的排查,这些排查经验完全可以标准化(比如对某个服务的TP99异常,需要进行的排查操作),问题排查流程标准化之后,就可以通过计算机自动化。我们提高诊断的准确度,就需要将这个流程更加智能化,减少人为参与。

我们希望通过一些自动化措施提升运维效率,从而将开发人员从日常的业务运维工作中解放出来,先来看一个用户使用场景:

如图5所示,触发服务保护有两条路径。

① 第一条,当用户在前期接收到我们的诊断报警后,直接被引导进入该报警可能会影响到业务大盘。这时我们要查看业务图表,如果影响到业务,引导用户直接进入该业务图表对应的核心链路,定位出问题的根本原因,进而再判断是否要触发该核心链路上对应的服务保护开关或预案。

图5 自动化业务运维系统核心建设目标

② 第二条,用户也可以直接通过诊断报警进入对应的核心链路,查看最终引起异常的根本原因,引导用户判断是否需要触发相应的服务保护预案。

发现问题–>诊断问题–>解决问题,这个过程每一步都需要不断地提升准确度,具体数据可以通过全链路压测来获得,当某些场景准确度非常高的时候,就可以变为自动化方案。

因此,我们的核心目标是,当整个方案可以自动化进行下去之后,对于用户来说的使用场景就变成了:收到异常报警->收到业务服务恢复通知。随着自动化方案越来越完备,开发人员可以更加关注业务逻辑的开发。

确定了核心目标,我们开始着手开发产品。接下来就介绍一下我们建设这套系统的核心产品以及各个产品模块之间的关联,其它设计细节与我们碰到的坑,本文不着重描述了,之后会有更加针对性的文章分享出来。

体系架构

如图6所示,在自动化业务运维系统中,业务大盘与核心链路作为用户使用的入口,一旦用户查看业务指标出现问题,我们就需要快速定位该业务指标异常的根本原因。我们通过对核心链路上服务状态的分析,帮助开发人员定位最终的问题节点,并建议开发人员需要触发哪些服务保护预案。业务大盘的预测报警、核心链路的红盘诊断报警以及已经收集到各个维度的报警事件,如果能对它们做进一步的统计分析,可以帮助开发人员从更加宏观的角度提前发现服务可能潜在问题,相当于提前对服务做健康检查。我们需要定期通过全链路压测来不断验证问题诊断和服务保护是否有效,在压测时可以看到各个场景下的服务健康状态,对服务节点做到有效的容量规划。

图6 业务监控运维体系架构

业务大盘

外卖业务会有非常多的业务指标进行监控,业务指标和系统指标、服务指标不同不同,需要业务方根据不同的业务自行上报监控数据。业务大盘作为业务运维系统的使用入口,可以让开发人员快速查看自己关心的业务指标的实时状态以及最近几天的走势。

图7 业务监控大盘及拓展能力

如图7所示,业务大盘不光需要展示业务监控指标,还需要有很强的对外扩展能力,比如:

① 当出现业务指标异常时,根据后台的监控数据分析,可以手动或者自动进行事件标记,告知开发人员是什么原因引起了业务指标的波动,做到用户信息量的快速同步。

② 可以带着时间戳与类型快速引导开发人员进入其它监控系统,提高开发人排查问题的效率。

我们会定期对生产系统进行全链路压测,同时为了压测数据不污染真实的业务数据,会对压测流量监控进行隔离。

外卖业务场景,使我们大多数业务监控数据都呈现出很强的周期性,针对业务数据我们可以利用历史数据使用Holt-Winters等模型进行业务数据预测,当我们的实际值与预测值不在置信区间内将直接进行告警。

因为是更加偏向业务的运维系统,我们针对敏感的业务指标进行了相应的权限管理。

为了增加系统使用场景,我们需要支持移动端,使用户可以在任何地方通过手机就可以查看自己关心的监控大盘并触发服务保护预案。

核心链路

核心链路也是系统主要的使用入口,用户可以通过核心链路快速定位是哪一个调用链出现了问题。如图8所示,这里会涉及两个步骤:

① 我们需要给核心链路上的服务节点进行健康评分,根据评分模型来界定问题严重的链路。这里我们会根据服务的各个指标来描绘一个服务的问题画像,问题画像中的指标也会有权重划分,比如:当服务出现了失败率报警、TP99报警,大量异常日志则会进行高权重的加分。

② 当我们确认完某条链路出现了问题,在链路上越往后的节点可能是引起问题的根节点,我们会实时获取该节点更多相关监控指标来进行分析诊断,这里会融合开发人员日常排查问题的SOP,最终可能定位到是这个服务节点某些服务器的磁盘或者CPU等问题。

图8 核心链路产品建设路径

我们最终会发出问题诊断结果,这个结果在发出之后,还需要收集用户的反馈,判断诊断结果是否准确,为我们后续优化评分定位模型与诊断模型提供有力的数据支持。在核心链路建设前期,我们会建议开发人员进行相应的服务保护预案触发,当我们的诊断结果足够准确之后,可以针对固定问题场景自动化触发服务保护预案,以缩短解决问题的时间。

服务保护&故障演练

图9 服务保护&故障演练模块的核心功能

服务保护&故障演练模块是让我们的业务运维体系形成闭环的重要部分,该模块需要具备的核心功能如图9所示。针对不同的保护需求,我们会有不同类型的服务保护开关,这里主要有如下几种:

① 降级开关:由于业务快速发展,在代码中会有成百上千的降级开关。在业务出现异常时需要手动进行降级操作。

② 限流开关:有些针对特定业务场景需要有相应的限流保护措施。比如:针对单机限流主要是对自身服务器的资源保护,针对集群限流主要是针对底层的DB或者Cache等存储资源进行资源保护,还有一些其他限流需求都是希望可以在系统出现流量异常时有效地进行保护。

③ Hystrix自动熔断:可以通过监控异常数、线程数等简单指标,快速保护我们的服务健康状态不会急剧恶化。

根据我们的运维经验,在出现生产事故时可能会涉及到多个开关的切换,这里就需要针对不同的故障场景预先设置服务保护预案,可以在出现问题时通过一键操作对多个服务保护开关进行预设状态的变更。我们既然有了应对不同故障场景的服务保护预案,就需要时不时来验证这些服务保护预案是否真的可以起到预期的效果。

生产对应的事故不常有,肯定也不能只指望生产真的出现问题才进行预案的验证,还需要针对不同的故障进行模拟。当我们生产服务出现问题时,不管是因为网络原因还是硬件故障,大多数表现在服务上的可能是服务超时或者变慢、抛出异常。我们前期主要针对这几点做到可以对核心链路上任一服务节点进行故障演练,生产故障可能会同时多个节点出现故障,这里就需要我们的故障演练也需要支持预案管理。

服务保护是业务运维终端措施,我们需要在软件上可以让用户很方便地直达对应的服务保护,这里我们可以很容易就将服务保护与业务大盘、核心链路进行整合,在开发人员发现问题时可以方便地进入对应的服务保护预案。有了这些保护措施与故障演练功能,结合与核心链路的关系,就可以与故障诊断与全链路压测进行自动化方面的建设了。

整合全链路压测

我们现在定期会组织外卖全链路压测,每次压测都会涉及很多人的配合,如果可以针对单一压测场景进行压测将会大大缩短我们组织压测的成本。如图10所示,我们现在主要在全链路压测的时候,针对压测流量进行不同场景的故障演练,在制造故障的同时,验证服务保护预案是否可以像预期那样启动保护服务的目的。后面会讲一下我们针对全链路压测自动化建设思路。

图10 提升全链路压测给我们带来的收益

前面主要介绍了我们在做基于业务的运维系统时需要的各个核心功能,下面重点介绍一下,我们在整个系统建设中,自动化方面的建设主要集中在什么地方。

异常点自动检测

图11 异常点自动检测

我们在做核心链路建设的时候,需要收集各个服务节点的报警事件,这些报警事件有服务调用时端到端的监控指标,还有服务自身SLA的监控指标。在和开发人员进行沟通的时候了解到他们平时配置这些监控指标的时候耗费了大量的人力,每个指标的报警阈值都需要反复调整才能达到一个理想状态,基于这些监控痛点,我们希望可以通过分析历史数据来自动的检测出异常点,并自动计算出应有的报警阈值并设置。如图11所示,我们根据不同监控指标的特点,选择不同的基线算法,并计算出其置信区间,用来帮助我们更加准确的检测异常点。比如我们的业务周期性比较强,大多数监控指标都是在历史同期呈现出正太分布,这个时候可以拿真实值与均值进行比较,其差值在N倍标准差之外,则认为该真实值是异常点。

自动触发服务保护

图12 异常检测与服务保护联动

我们的服务保护措施有一部分是通过Hystrix进行自动熔断,另外一部分是我们已经存在的上千个降级、限流开关,这部分开关平时需要开发人员根据自己的运维经验来手动触发。我们如果能够根据各种监控指标准确的诊断出异常点,并事先将已经确定的异常场景与我们的服务保护预案进行关联,就可以自动化的进行服务保护预案的触发,如图12所示。

压测计划自动化

图13 压测计划自动化

我们定期进行的外卖全链路压测,需要召集相关业务方进行准备和跟进,这其中涉及的数据构造部分会关联到很多业务方的改造、验证、准备工作。如图13所示,我们需要通过压测计划串联整个准备、验证过程,尽量少的有人为活动参与到整个过程中。这其中我们需要进行如下工作的准备:

  • 针对真实流量的改造,基础数据构造、数据脱敏、数据校验等尽可能通过任务提前进行。

  • 进入到流量回放阶段,我们可以针对典型的故障场景进行故障预案的触发(比如:Tair故障等)。

  • 在故障演练的同时,我们可以结合核心链路的关系数据准确定位出与故障场景强相关的问题节点。

  • 结合我们针对典型故障场景事先建立的服务保护关系,自动触发对应的服务保护预案。

  • 在整个流程中,我们需要最终确认各个环境的运行效果是否达到了我们的预期,就需要每个环节都有相应的监控日志输出,最终自动化产出最终的压测报告。

整个压测计划的自动化进程中,将逐渐减少系统运行中人为参与的部分,逐步提升全链路压测效率。我们希望,用户点击一个开关开始压测计划 ,然后等待压测结果就可以了。

图14 自动化建设后期发力点

在整个业务运维系统建设中,只有更加准确定位问题根节点,诊断出问题根本原因才能逐步自动化去做一些运维动作(比如:触发降级开关,扩容集群等)。如图14所示,我们会在这些环节的精细化建设上进行持续投入,希望检测到任意维度的异常点,向上推测出可能会影响哪些业务指标,影响哪些用户体验;向下依托于全链路压测可以非常准确的进行容量规划,节省资源。

刘宏伟,2016年加入美团,主要负责外卖业务架构相关工作,现正在围绕业务建设监控运维体系。

**美团外卖C端业务架构组:基于业务、服务、数据,进行深度整合、统一架构、规范,为外卖提供统一基础服务,收集各业务线监控数据,进行实时分析统计。我们正在努力将开发人员从日常运维工作中彻底解放出来,打造高效的业务运维平台。我们非常欢迎有业务运维经验,熟悉异常检测算法,对业务监控运维产品有深刻理解的同仁加入我们,共同提升美团外卖服务稳定性。

联系邮箱: liuhongwei04#meituan.com**

  • MCC :美团内部配置管理系统,可以进行项目中的配置管理,开关管理等。
  • CAT :美团实时监控系统,具体参考:深度剖析开源分布式监控CAT。
  • DIGGER :美团外卖实时业务监控系统,具体参考:DIGGER业务监控。
  • FALCON :小米开源的监控系统,在美团主要偏向于系统指标监控,具体参考:Mt-Falcon——Open-Falcon在美团的应用与实践 。

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

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

相关文章

把数据集刷穿是什么体验?MetaQA已100%准确率

文 | 炼丹学徒编 | 小轶开始炼丹以来,估计很多小伙伴都和我一样幻想过直接把数据集做到 100% 准确率,然后大吼一声:这数据集,我做到头了!然而愿望终究是愿望。大多时候,看着自己手头上用了浑身解数才提了零…

LeetCode 116. 填充每个节点的下一个右侧节点指针(递归循环)

文章目录1. 题目2. 解题2.1 递归2.2 循环2.3 O(1)空间复杂度1. 题目 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 n…

大圣魔方——美团点评酒旅BI报表工具平台开发实践

当前的互联网数据仓库系统里,数据中心往往存放了大量Cube化或者半Cube化的数据。如果需要将这些数据的内在关系体现出来,需要写大量的程序和SQL来发现数据之间的内在规律,往往会造成用户做非常多的重复性工作;而且由于没有数据校验…

基于知识图谱的智能问答方案

基于知识图谱的智能问答方案:https://cloud.tencent.com/developer/article/1661504 基于知识图谱的智能问答方案2020-07-142020-07-14 15:57:50阅读 9950三个角度理解知识图谱2012年谷歌首次提出“知识图谱”这个词,由此知识图谱在工业界也出现得越来越…

论文浅尝 - ACL2020 | 用于实体对齐的邻居匹配网络

笔记整理 | 谭亦鸣,东南大学博士来源:ACL 20链接:https://www.aclweb.org/anthology/2020.acl-main.578.pdf1.介绍图谱之间的异构差异是建立实体对齐的一个主要挑战,本文提出了Neighborhood Match Network (NMN),用于处…

LeetCode 117. 填充每个节点的下一个右侧节点指针 II(递归循环)

文章目录1. 题目2. 解题2.1 递归2.2 queue循环2.3 利用next循环1. 题目 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 类似…

美团点评境外度假团队前端项目开发实践总结

随着前端项目数量和规模越来越大,参与的人员也越来越多,如何在前端项目开发过程中保证优质的开发者体验和项目的可维护性,同时确保极致的用户体验将会是一个非常大的挑战。 为了应对这个挑战,美团点评境外度假前端研发团队自2016年…

线性代数不深入,机器学习两行泪!

我经常听到有人说,机器学习很难,到底怎么学更高效?其实,我想说,机器学习本身没有多大难度,因为经过多年的积累后,很多规则已经成型了。对于我们来说真正难的,是机器学习背后的算法所…

反爬虫机制和破解方法汇总

https://cloud.tencent.com/developer/article/1032918 什么是爬虫和反爬虫?爬虫:使用任何技术手段,批量获取网站信息的一种方式。反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。常见的反爬虫机制…

论文小综 | 知识图谱表示学习中的零样本实体研究

转载公众号 | 浙大KG 本文作者| 耿玉霞,浙江大学在读博士,主要研究方向为知识图谱、零样本学习及可解释性前言随着知识图谱表示学习算法的蓬勃发展,在各个领域中都得到了广泛的应用,如推荐系统、知识问答等,以及知识图…

LeetCode 297. 二叉树的序列化与反序列化(前序遍历层序遍历)

文章目录1. 题目2. 解题2.1 前序遍历2.2 层序遍历1. 题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据…

互联网企业安全之端口监控

外网端口监控系统是整个安全体系中非常重要的一环,它就像眼睛一样,时刻监控外网端口开放情况,并且在发现高危端口时能够及时提醒安全、运维人员做出相应处理。 对安全人员来说,互联网公司在快速发展壮大的过程中,外网边…

知乎热榜:程序员达到什么水平能拿到20k月薪

昨天在知乎上刷到一个热门问题:程序员需要达到什么水平才能顺利拿到 20k 无压力?其中一个最热门的回答是:“其实,无论你是前端还是后端、想进大厂还是拿高薪,算法都一定很重要。”为什么,算法会如此重要?不…

研究综述 | 知识图谱划分算法研究综述

作者 | 王鑫,天津大学智能与计算学部来源 | 计算机学报知识图谱划分是大规模知识图谱分布式处理的首要工作,是知识图谱的分布式存储、查询、推理和挖掘的基础支撑。从知识图谱和图划分的定义出发,系统性地介绍当前可用于知识图谱数据划分的各…

深度学习中不得不学的Graph Embedding方法

原文链接:https://zhuanlan.zhihu.com/p/64200072 深度学习中不得不学的Graph Embedding方法王喆​数据挖掘等 3 个话题下的优秀答主​关注他1,290 人赞同了该文章这里是「王喆的机器学习笔记」的第十四篇文章,之前已经有无数同学让我介绍一下Graph Embe…

写给新手炼丹师:2021版调参上分手册

文 | 山竹小果在日常调参的摸爬滚打中,参考了不少他人的调参经验,也积累了自己的一些有效调参方法,慢慢总结整理如下。希望对新晋算法工程师有所助力呀~寻找合适的学习率(learning rate)学习率是一个非常非常重要的超参数&#xf…

函数式编程在Redux/React中的应用

本文简述了软件复杂度问题及应对策略:抽象和组合;展示了抽象和组合在函数式编程中的应用;并展示了Redux/React在解决前端状态管理的复杂度方面对上述理论的实践。这其中包括了一段有趣的Redux推导。 软件复杂度 软件的首要技术使命是管理复杂…

论文浅尝 - EMNLP2020 | ConceptBert:视觉问题回答的概念感知表示

笔记整理 | 陈卓,浙江大学计算机科学与技术系,博士研究生研究方向 | 知识图谱/图神经网络/多模态论文链接:https://www.aclweb.org/anthology/2020.findings-emnlp.44.pdf代码:https://github.com/ZiaMaryam/ConceptBERT发表会议&…

LeetCode 215. 数组中的第K个最大元素(快速排序)

1. 题目 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k 2 输出: 5示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k 4 输出: 4说明: 你可以假设 k…

论文浅尝 - EMNLP2020 | 通过词重排序跨语言解析

笔记整理 | 吴林娟,天津大学硕士来源:EMNLP2020链接:https://www.aclweb.org/anthology/2020.findings-emnlp.265.pdf动机依赖解析研究快速发展,然而依赖解析的性能在很大程度上依赖于语料库的大小。获取足够的训练数据成本大且困…