自愈:问题自动发现与修复

分享一个颇为曲折的故事。

一、背景

早在2016年的时候,我实现了一个监控系统,自动检查数据平台各节点的基础数据是否一致。

可是,这个仅仅是监控系统,用于检验缓存实时更新功能的正确性。

2019年春节前夕,部门提出要做一个万能的通用的自愈系统。

当时各种脑暴讨论,讨论到最后,发现要做到万能与通用,这个自愈系统就需要与业务无关,也就变成了一个状态机模式的调度系统。

而当时周围还没有任何一个自愈相关的实践,大家不仅希望万能通用,还希望与业务有关系,后来大部分人都有新的项目了,这件事便不了了之了。

年前的时候,我们团队的服务遇到一个问题,然后做了一个实实在在的自动发现与自动修复系统,为自动修复积攒了不少经验,下面分享给大家。

二、几年后出问题了

image

还是上面的数据平台,基础数据通过内部设计的一套通知机制,几乎做到数据完全一致。

而对于非基础数据,比如第三方储存或服务提供的数据,无法走内部这一套通知机制。
这部分数据修改后,生效时间会比较久。

为了加速第三方服务的生效时间,第三方服务也复用了内部的通知机制。

但是这样有一个问题。
缓存服务收到更新通知后,会去第三方服务拉最新数据,此时第三方服务有很小的概率返回旧数据。

这导致第三方服务数据不一致问题小概率性出现。

……

巧妙的是,以前底层cms的很多计算逻辑都是通过各种脚本定时完成的。
这使得每计算一个数据,都会触发一次写操作。

这种多次写恰好修复了这个不一致问题。

因为第一次写的时候,第三方服务会有小概率计算出旧数据。
几秒后第二次写的时候,第三方服务依赖的下游是旧数据的概率就非常小了。
实际情况时,会写很多很多次,所以概率被无限缩小。

PS:对于后面的重复写,大家可以理解为第三方服务计算的新数据没变化,但是缓存认为有变化,再次去拉取第三方服务。

就这样第三方服务运行了好几年,几乎没出现什么问题。

……

不幸的是,春节的前几周,底层cms升级改造正式上线,所有计算逻辑只会写一次。

这使得第三方服务问题暴露出来,被无数运营投诉。

让底层cms暂时回滚是行不通的。
对数据系统的架构进行重构,使这个第三方服务支持快速更新,短期内也没那个时间。
所以做一个自愈系统就显得非常有必要了。

三、自愈系统架构

简单思考下,自愈系统大概分为三大模块:数据输入模块、数据拉取模块、数据对比修复模块。

如下图

image

数据输入模块一般是从消息队列接收消息。
这里可能还需要对输入的数据进行过滤标准化等预处理逻辑。
最终将需要监控的数据放入任务队列。

由于不同任务需要等待不同的时间才能启动检查。
任务队列可以是一个按处理时间排序的列表。

数据拉取模块每次从任务队列顶部检查是否有到达时间的任务。
有了取出,先拉取基准数据(认为是正确的),再拉待校验的数据(可能需要拉很多接口的数据)。
当然,这里与数据输入一样,需要对拉取的结果进行过滤与标准化。

之后就是对比数据是否一致,不一致了调用修复接口进行修复。

上面就是一个自愈系统简化后的模型。

四、加强版自愈

年前的时候,让一个同事做了这样一个系统。

那个版本为了快速测试流程,很多参数是 hardcode 的。
我简单的 codeview 了架构流程,看着没啥问题。

后面我提出一个要求:这些参数需要配置化。
于是相关参数被改成配置文件读取后,就直接发布上线了。

上线后的一个月内,运营也都没有来反馈问题了。

……

可是,半个月前,运营突然又大面积反馈这个问题了。

我心中有一个很大的疑惑。
如果自愈系统有问题,一个月前就应该不断的遇到问题。
如果自愈系统没问题,这些问题就应该被自动发现自动修复。
难道仅仅是概率问题?

于是我同时要到 自愈系统和 第三方系统的代码,进行 codereview
然后发现第三方系统存在两个问题,自愈系统存在一个过滤问题。

将问题反馈给相关负责人后,第三方系统的问题被修复了一个,自愈系统的过滤问题也被修复了。

但是运营依旧在投诉,这说明问题依旧存在。

此时,我们正处于组织架构调整期。
第三方系统 和 自愈系统的负责人都去做其他新项目去了。

问题还是需要解决,于是我开始接手这两个服务了。

……

接手后需要做两件事情。

第一件事是修复第三方系统遗留的那个已知问题。
第二件事是分析自愈系统为啥没有发现问题、修复问题。

由于数据节点众多,目前自愈系统检查节点数据的逻辑是抽样拉取的。
分析了之前有问题的数据,如果数据有问题,是必现的。

难道刚开始那几秒,数据在反复变化?
于是我猜想,一次抽样可能发现不了问题,全部计算量又太大。

一种不错的方法是有策略的多次检查。

最常见的策略有:等差策略、指数策略。

等差策略就是每隔多少秒触发一次检查。
比如第5、10、15、20、25、30秒检查。

指数策略就是每次间隔时间翻倍。
比如第5、10、20、40、80、160秒检查。

我对这两个策略都不是很满意,因为时间间隔的太近了。

于是我引入了阶乘策略,即相乘的因子每次加一。
比如第5、10、30、120、600、3600秒检查。

算法确定后,就是代码实现了。

将算法封装在一个对象内后,实现还算简单,很快我就上线了。

image

当我分析策略的正确性时,我惊呆了。
数据拉取模块竟然有一个隐藏很深的BUG,使得结果永远都被认为是一致的。

自此,我前面提到的疑惑算是得到了解释,确实是概率问题。自愈系统从来没正常执行过。

问题修复后,运营果然几乎不反馈问题了。
后来他们又反馈了一个问题,分析之后,发现是新功能不在监控范围之内,我补充进去后,然后到现在为止再也没收到反馈了。

五、回顾

回顾一下这个自愈系统,整个流程大概确定了。

大概如下:

1、MQ 输入任务、过滤、标准化
2、有策略的进入任务队列
3、调度任务拉取基准数据与对比数据,结果标准化
4、任务结果对比,不一致时进行自愈修复

疑惑解开之前,我引入了有策略的多轮检查机制来确保问题被发现与修复。

而最终的问题竟然是一个隐藏的BUG。

这个问题属于逻辑BUG,只能引入单元测试来发现。

由于涉及到各种接口网络调用,还需要使用 MOCK 钩子来解决依赖。

单元测试和MOCK钩子我在个别项目中用到过,后面有时间了,也引入到这个项目来。

到时候再给大家分享一下单元测试的实践与MOCK钩子的实践。

《完》

-EOF-

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容