课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
要知道,每一个程序系统都不是单独存在的,而是由众多小系统组成的。而今天我们就一起来了解一下,关于系统故障的问题应该如何发现和解决。
故障发现
所谓“故障发现”,就是通过技术手段实时采集系统中每个节点的健康状态,以及每2个节点之间链路的健康状态,包括但不限于调用成功率、响应时间等等。借此代替我们的眼睛去盯着整个系统,一旦低于某个设定的阈值,就触发报警给我们一个提醒。因为当你的系统中存在成百上千的程序时,靠肉眼去找到发生故障的位置,简直是天方夜谭。哪怕找到了,也可能已经产生了巨大的损失。
负责故障发现的解决方案都属于应用性能管理(APM)范畴。我们在部署这个“眼睛”的时候,需要考虑到全方位的覆盖,要包含所有的节点。比如:
在Web方面可以直接利用浏览器提供的导航计时(NavigationTiming)和资源计时(ResourceTiming)接口来采集性能数据,非常方便。
在iOS、Android这种App方面通过源代码插桩的方式进行。比如直接引入采集SDK然后硬编码在源代码中,或者通过AOP框架来进行动态代码注入。代码的注入位置就在每个方法的执行前和执行后。
故障消除
现在已经能够很容易的发现故障了,我们就可以通过综合运用隔离性、横向扩展、代理、负载均衡、熔断、限流、降级等等机制来快速的“掐灭故障”。
分布式系统的规模越大,耦合越严重,各个子系统之间通过网络连接在一起,就如赤壁之战中的曹军连在一起的船舶一样,只要其中一个着火了就会就近蔓延。所以,一旦发现某个子系统挂了,就需要尽快切断与它的联系,保证自己能够不受连累,防止雪崩的发生。
我们可以先运用docker之类的技术将每个应用在运行时的环境层面隔离开来。然后,通过横向扩展让每个应用允许被“Copy”,以此来部署多个副本。接着,结合代理和负载均衡让这些副本可以共同对外提供服务,使得每个应用程序本身先具备“高可用”。后的三大防御措施,熔断、限流、降级来快速“掐灭故障”,避免故障在不同的应用程序间扩散。
故障善后
“故障消除”避免了级联故障导致的系统性风险,这时整个分布式系统已经具备健壮性了。但是对正在使用系统的用户来说,这些故障还是可见的,因为会反映成他实际操作中的错误提示,甚至导致流程无法继续。这对我们“衣食父母”来说并不友好,终可能会导致用户的流失。
所以,我们应该通过一些补偿和缓冲的方式将故障产生的影响降到低,尽可能的去包容故障,让用户无感。并且,这些善后工作应该与“故障发现”、“故障消除”一起形成一个完整的体系,以及尽可能的自动化。
前面我们聊到,故障产生的原因要么是调用的节点处于异常状态,要么是通信链路异常。所以,要做好“故障善后”,就需要在节点之间的连接上做文章。根据CAP定理、BASE理论,我们已经很清楚两个进程之间的调用方式。一是直接点对点的同步调用,或者是通过一些技术中间层进行异步的调用。
作者:张帆
节选:infoq
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。