ServiceRank: 使用马科夫链对微服务进行影响力评分

ServiceRank: 使用马科夫链对微服务进行影响力评分

长期实践微服务架构的企业可能都会关注到的一个问题就是随着业务的增长和迭代,微服务个数和依赖关系会逐渐膨胀到难以维护的地步(比如数千个微服务)。目前业界通行的做法是结合流程和业务团队进行梳理盘点。但随着组织架构变化和短生命周期微服务的引入,手工治理方法逐渐面临信息陈旧、关注盲点等瓶颈。对于这个挑战,我们开发了一套完全基于可观测数据的微服务依赖关系评分规则,来对业务服务的重要程度进行评分,用来辅助我们对重要服务的运维和治理。

假设微服务调用关系

首先,假设有如上微服务依赖关系,属于一个典型的有向图构成的网络。这里我们假设各服务去依赖其他服务完全取决与自身业务选择,和调用自身的业务无关。同时,又假设访问调用所有依赖服务的概率均等。则以服务 C 为例,调用它的概率分别为调用 A 和 B 的 50%:

SR(C) = \frac{SR(A)}{deps(A)} + \frac{SR(B)}{deps(B)}

如果要求调用 A 的概率,则需要看调用 D 的概率和 D 的其他依赖。可以看出整个微服务调用的概率关系构成了一个马科夫链。用转移矩阵表示如下:


R = \begin{pmatrix} 0 & 0.5 & 0.5 & 0\\ 0 & 0 & 0.5 & 0.5\\ 0 & 0 & 0 & 1\\ 1 & 0 & 0 & 0 \end{pmatrix}

我们寻找服务被调用概率的问题,变成了寻找特征向量 \vec{x} 满足等式 \vec{x} = \vec{x}R 的问题。参考 PageRank 使用幂法计算,在 Wolfman Alpha 上计算迭代几十次结果逐渐收敛于:

\vec{x} = (0.306925, 0.154509, 0.231389, 0.307178)

我们再来看线上的应用。为此我们开发了实时根据指标分析微服务依赖的服务,持续更新服务的依赖关系,当依赖关系发生变化时,触发重新计算 ServiceRank. 下图展示了接近实时更新的微服务排名。出于保密考虑隐去了服务名,实际序列号生成服务,应用开关,核心业务模块的服务全部榜上有名。

这套评分机制的第一个应用是 SLO 的推导,我们假设服务依赖对可用性的影响是乘方关系,那么反推对被依赖方的要求应该是开方的关系。选择的公式如下(感兴趣可以自己推导一下)。可以看出整站 4 个 9 的情况下,核心服务要求 5-6 个 9 的可用性才能保证达标。


SLO(Service_i) = SLO(site)^\frac{1}{N*SR(Serevice_i)}

目前我们这套算法正在改良阶段,后面会逐步的把依赖 qps 权重,熔断等关系考虑进来。我们也在尝试把网络分析的一些方法用在分析微服务结构中,后面也会把相关进展同步出来。

编辑于 2020-05-27 15:47