我负责了咱们公司几个十分大的渠道体系,日均拜访量超过了千万级别,用户过亿。其间某个推送体系每天的消息推送量是过亿级别的。虽然流量和用户都巨大,高峰期的请求也十分高,可是这五年来咱们没有呈现过任何恶性的线上影响用户的定级毛病,那咱们是怎样样做到的呢?里边有没有一些值得借鉴的办法可以供大家参阅呢?

首先并不是说咱们这个体系天生便是安稳的,任何人来维护都不会引发毛病,而实际上咱们在这五年中也迭代了许多的需求,期间也产生过或大或小的一些改变事端、代码事端,可是都被咱们杰出的机制应急保证的十分成功,所以没有继续上升成影响多数用户的恶性毛病,那么我今日就来跟大家共享一下我是怎样做到的。

我是如何保障亿级用户系统五年0故障

关于毛病的知道

首先是关于毛病安稳性的认知上面。我经历过许多毛病,特别是刚开始毕业的时分,因为自己的经历不行老练,关于体系的毛病的认知不行全面,所以导致了一系列影响线上客户的问题,而有一些还被晋级成了定级毛病。

所以关于大流量高并发的体系来说,最首要便是要树立对体系毛病的认知。一个页面一个人拜访,100个人拜访和1万个人拜访,它的影响面是不同的。研制同学关于自己所构建的体系可以影响多少用户应该有一个明晰的评价。比方我现在维护的体系每天的拜访量有几千万,所以它的安稳性是至关重要的,稍有不小心或许会引起大面积的用户不行用。

作为研制同学,必定要知道到毛病关于用户的体感来说是十分恶劣的,咱们这个职责自身就要求咱们要敬畏线上进敬畏客户,特别是关于咱们这种实时体系,一旦产生了问题,用户可用性就会被打断,有时分形成的影响甚至是无法挽回的。

因而,对毛病的认知、对职业的认知,就要求咱们不能心存侥幸、敷衍了事、粗糙编码和上线。咱们实际上经过各种案例发现,许多一线的研制同学丝毫不尊重用户从而形成引起恶性的线上事端。比方未经测验直接上线、发布后不论不问体系监控状况、事务呈现问题后无法联系到相关的开发同学等等。

安稳性管理机制

在完成了自己关于毛病的影响面认知程度之外,现在便是到了咱们要点环节,便是要树立一整套完好的制度来保证安稳性。

  • 大盘和监控

在整个安稳性的保证里边,我觉得监控和告警是最重要的,因为假如没有了监控和告警,就无异于盲人摸象,整个体系到底有什么问题,问题什么时分会产生。产生了以后是什么样的影响面都不知道的状况下的话,就等于一个瞎子。

所以在体系或许事务上线的时分,就要同时伴随着监控和大盘的上线,咱们不允许一个新的模块上线却不存在对应的监控的状况。

一般来说整个监控体系自身应该是比较完善的,有硬件、软件和事务体系的监控指标。也有跟周期相关的大盘的监控指标,比方说和上星期的同比,和昨日的同比等等。在许多时分还可以对中间件进行一系列完好的监控,比方说关于数据库的监控,关于缓存的监控,关于PC结构调用的监控等。

还有一些可以针对自己事务单个接口的监控,在一些比较特殊的状况下的话,还有针对关键字的监控,比方可以单独装备监控日志里的NullPoint,用来快速定位到某些详细的问题,现在开源的一些监控体系都具有了这种即时数据收集和展现的才能。

除了监控之外,还要配套的便是报警机制。假如体系出了问题,研制同学第一时刻感知不到。监控就等于是白费的,同时依据毛病的等级、接口的调用量,咱们会装备不同等级的监控,比方说十分紧迫的问题,会用电话的方法进行报警。稍微弱一点的或许用群或许用短信的方法进行报警。

【集团报警】[2022/12/28 02:26] mm-orchard-push[hsf顾客成功率]
[C] 共有1台机器[hsf顾客成功率]触发[CRITICAL]报警, 摘要:   
* 3x.6x.5x.1xx  当时时刻的值: 87.50% < 90%   
租户: 使用监控,使用: mm-orchard-push 
报警计算:初次触发

报警的告诉方针一般是事务的负责人或许固定的值勤告警群等。这种报警的目的是可以第一时刻让使用的负责人能感知到毛病,而且让事务或许使用负责人作为接口人,能快速地找到上下游进行应急处理。当然告警机制自身也是需求演练的,以防止告诉机制因为各种原因失灵导致无法及时把问题同步给负责人。比方曾经就产生过体系短信欠费导致开发负责人收不到短信的问题产生。

  • 日常值勤

还有一个事前预防性的措施便是日常的值勤,日常的值勤也分了两种,一种是咱们的早值勤,早值勤主要是在8点~10点,这一段时刻或许大部分的开发同学都没有来到公司上班的时分,咱们会要求至少有一位员工是在线上调查问题。这个调查问题可以是检查体系日志或许获取线上用户的投诉CASE。

这个机制的保证可以监控到一些时刻错位的问题。比方咱们昨日晚上的发布,客户流量比较少,没有触发用户投诉,到了第二天早上客户许多的拜访体系而形成的不行用引起的投诉。早值勤处理的问题也是相同,也便是要第一时刻感知到毛病的产生,可以进行快速的一个止血,突出的也是一个敏捷性。

其次便是咱们日常的惯例值勤,咱们产品发布后都会有一些的产品不行用的问题、产品难用的咨询以及线上非预期的问题,那么咱们会以一个值勤群的方法,让客户或许事务方或许合伙合作伙伴都拉到群里,有一些客户在发现了客体系不行用的时分,第一时刻会把不行用的问题说到群内,咱们在值勤的时分就可以及时快速的去判别这个问题是否是改变引起的毛病问题。

不论在早值勤仍是在日常的答疑群里边,咱们碰到这些问题的话,都会评价是否有毛病的危险,然后都会尽快的建立毛病应急小组,履行相应的预案或许方案。

  • 演练压测

演练和压测是预防毛病里边十分重要的一个过程,也便是经过一些惯例性的动作模仿用户的许多请求,可以帮助发现体系的漏洞,把体系的不完善的当地悉数露出出来。咱们在压测和演练的时分,一般会选在流量低峰期,既能露出问题,又不会大面积的影响线上的真实客户。

那为什么要频繁演练呢?那是因为咱们整个互联网的体系都是经常会有迭代和更新的需求,当咱们某一次演练体系没有问题之后,事务或许又产生了许多的改变,很有或许会有新的毛病点或许危险点的注入,那么这个时分经过惯例化的演练,就可以更早露出问题。

咱们压测和演练都惯例化了,每个月至少履行一次压测或许一次演练,压测一般也会选择中心接口以及本个本代里边新增的重要事务接口。在压测期间,咱们会关注到关于上下游的事务分的调用以及自身的功用压力,当压测到极限的时分,发现了当内存、CPU、数据库仍是外部依赖的超时的时分,咱们会中止压测并记载问题,并终究复盘问题,关于相关的不符合预期的问题就进行一个剖析和管理。

  • 技能方案评定

关于如此大流量的体系,咱们要求一切的稍微大一点的需求改变,咱们都要走完好的技能方案评定。因为有时分一个不合理的架构设计会导致毛病频繁而且难以根治,架构的高雅性决定了毛病的底线是高是低。

技能方案评定除了关于整个事务的ROI(投入产出比)进行一个通晒和判别之外,咱们还会要求技能方案有完好的安稳性方案。

这个安稳性的方案一方面是要求关于现有的技能选型,要评价它是否会引进直接的危险点,比方说咱们引进了一些新的缓存体系,那么缓存体系的容量能不能符合要求?缓存体系对咱们事务保证的SLA又在多少?

除了关于体系方案的调研之外,咱们也要求要有配套的保证的监控体系,比方咱们这次引进的事务迭代有没有相关的监控和大盘?

其次便是要有事务开关和灰度战略。咱们要求一切的中心功用上线都必须要有开关和灰度的方法,可以充沛下降事务危险。而实际上表明咱们关于这么大流量的状况下的话,用灰度是十分好的一个方法,灰度实际上便是把整个新的功用露出在一小批用户而且咱们去验证这些小批用户的可用性。

咱们许多时分都发现咱们在刚刚灰都了一批用户的时分,就发现了反常,咱们及时的就会回滚和修正,这样就避免了把一切的用户露出在毛病和不行用的功用里边。

  • 毛病应急机制

没有完美的体系,哪怕你的代码编写的再好,你的测验再完善,都或许会有遇到一些突发状况。比方非预期的流量、比方底层的网络超时、比方硬盘毛病等。

所以咱们建立了毛病的应急机制。不论是产生了体系的主动告警,仍是用户投诉,咱们值勤的同学或许事务的负责人可以第一时刻感知到这些过错,而且可以快速得晋级,依照SOP流程建立应急小组并把毛病危险上升到指定的层级。

应急小组的形式往往是一个钉钉群,在必要的时分,咱们会直接呼起电话会议,把上下游和受影响的团队都会悉数拉上,快速的进行一个毛病的初步判别以及止血方案的交流。

所以咱们的应急消防要求的特色便是要敏捷,可以快速的对毛病进行呼应,因为你只要呼应的时刻提早一分钟止血,客户受影响的时刻就短了一分钟。许多大型公司会有保证制度,比方在指定的时刻内完成对毛病的处理,可以直接下降毛病等级,也表现了公司的文明和价值倡议,即出问题不行怕,假如能快速止血问题,便是值得鼓舞的行为。

因而咱们在整个部分里边也要求做到1-5-15,也便是1分钟感知到毛病5分钟定位的问题15分钟解决问题。当然在实际的过程中很难关于一切的毛病都做到1-5-15,可是这是咱们体系管理要继续寻求的方针。

  • 紧迫预案

咱们的一些中心功用在上线的时分,咱们都要求有紧迫的降级预案,比方说当咱们上线的功用发现了极点不行用的状况下的话,能否快速的止血?比方咱们的产品就有一个十分好的大局降级方案,便是咱们的服务端接口或许咱们依赖方产生了大规模不行用的状况下的话,咱们有一个紧迫预案便是可以一键降级的缓存,那么客户就可以直接拜访他的客户端缓存,这样的话就给了咱们留下了许多时刻去查验和修正问题。

紧迫预案包含有许多方法,比方关于某些接口设置限流,在无法快速解决问题的时分,可以经过限流来维护体系,尽量把影响面降到最低。

  • 复盘

最终便是毛病复盘。咱们不能等待咱们一切的愿望都是白璧无瑕的,正如体系相同,咱们关于毛病的知道和毛病的处理也是需求重复迭代晋级的。咱们要求和鼓舞复盘文明,不仅仅对影响到真实用户的问题进行复盘,也对潜在的问题进行复盘。

总结

首先我觉得关于一个研制同学来说,毛病或许长时间来看是不行避免的,可是咱们仍是要提升自己的关于毛病的认知观,因为咱们给客户形成了不行用,便是在必定程度上研制工程师的价值,那么咱们应该寻求写出十分优异的代码,可以写出十分鲁棒的体系,以及在体系呈现了不行预期的问题下咱们快速的去恢复用户的体验。

最终也不能因噎废食,不能因为怕引起毛病就逃避写代码,这信任也不是公司请咱们来的原因。而应该斗胆立异、小心试错,在呈现问题的时分,积极主动呼应和管理,而且继续复盘进步,这便是一名优异的工程师所要寻求的素养。

更多原创内容,关注大众号:ali老蒋 或拜访网站:www.javaer.com.cn/