那些黑天鹅教会我们的IT知识

 

近日国际市场可谓黑天鹅事件不断,先是由于石油输出国组织OPEC与俄罗斯的减产谈判未果,造成国际原油价格大跌40%,截止昨天甚至一度触及19美元低位。而美国三大股指也在3月9日以来迎来数次暴跌,短短几天当中触发了5次熔断,这是美股几十年来也未见到过的景象暴跌熔断。

其实所谓的熔断机制,简单来说就是当股市跌到一定幅度之后,市场自动停止交易一段时间的保护机制。这样做的主要目的就是,防范恐慌情绪进一步扩散,给市场带来更大的冲击。

融断是在1987年的著名股灾“黑色星期一”后,由美国监管机构所提出的。自提出后的三十多年来美股市场只有1997年10月27日,由于道琼斯工业指数暴跌7.18%,而触发过熔断机制。

其实从更宏观的角度上看,经济系统与信息系统并不二致,很多道理都是相通的,从IT的角度理解所谓的熔断机制,其实就是蓝屏警报而已。笔者接下来就和大家聊一下我们能从那些经济黑天鹅事件中学到什么。

复杂系统的预测术

在复杂系统的发展趋势的规律中,边际效用定律应该是最为重要的约束条件没有之一。它的基本内容是,在一定时间内,在其他商品的消费数量保持不变的条件下,消费者从某种物品连续增加的每一消费单位中所得到的效用增量,即边际效用是递减的。

比如我们在单核CPU的时代只需要给CPU多加一个核心就可以使性能得到一倍的提升,但是在目前动辙十几个核心的情况下,多加一个核心对于系统性能的提升就十分有限了,边际效应的限制对于系统的影响与演进是非常明显的。

而边际效应对应的则是正反馈效应了,正反馈是指系统的输出影响到输入,造成输出变动持续加大的情形。比如金融市场当中的各种杠杆类产品,在面对巨大跌幅时就会被强制爆仓,形成典型的正反馈现象。

也就是系统在向一个方向演化的过程中,其发展趋势往往会受到边际效应的限制而愈发的举步为坚,但是当系统发展到一定程度以后,向反方向演化的趋势一旦开启,往往就立刻形成正反馈现象,而迅速演进。而做为一名系统架构师所要关注的点在于这种趋势反转的临界点是否可以被预测,如果可以预测,那么就应该在临界时启动如蓝屏告警的保护机制,防止事态扩散。

不过从目前最新的研究结论来看复杂系统的临界点很可能是不可预测的,也就是说危机的到来可能真的是随机事件。比如当我们在沙滩上把沙子堆成一个金字塔形状的沙堆时,就是在构建一个最简单的复杂系统。为此物理学家专门做过实验,发现当沙堆中的沙子会自发地形成一个自组织系统,也就是说,当一粒新的沙子进入或者脱落之后,原来的沙子都会自动地调整位置,并趋于稳定。但是,随着沙子继续增加或者掉落并达到一个临界值后,沙堆就会进入不稳定状态。这个时候,沙堆随时可能会发生塌方,但是具体何时塌方,对不起这完全是一个随机事件,无法预测。当然用沙堆来类比经济系统可能存在问题,不过笔者更加倾向于经济危机无法被预测的观点。

复杂系统的平衡术

让我们假定临界点的到来不可预知,那么系统在运行过程中就只能在各项目标中寻求平衡了,而且这种平衡术也普遍存在于系统设计的原则当中,比如从微观上看,分布式系统需要在CAP三要素当中平衡,货币系统受到蒙代尔三角的制约,这些设计原则笔者在诸如《远程办公 4 大坑,坑坑“致命”!》等文中都有过详细介绍,这里不加赘述了。

而从宏观上看,只要系统达到一定的复杂度,那么系统设计者就必须在系统的健壮性、容错性与连续性之间做出平衡。如果一味强调健壮性,那一旦系统发生错误,就很可能让错误扩大化,酿成更大危机,而如果单纯追求容错性,那么经常带病上岗的系统,健壮性又不会太强。

比如我们人类就是韧性也就是容错性特别强的物种,虽然在健壮性上不如恐龙等生物,不过在面临到巨大灾难时,人类就会比恐龙更容易逃过一劫,但是呢站在更高的角度上说人类统治整个地球的时间并不长,今后鹿死谁手未为可知,我们容错性最强是否就是最佳策略真的很难讲。

再举一个电竞的例子,在DOTA比赛中到底是选择以小娜迦为核心的容错体系,还是选择拍拍熊为核心的硬刚体系,其实就是在做这样的平衡。以健壮性为核心的硬刚体系容易被对手翻盘,甚至直接猝死;而容错性为核心的体系容易被对手积累优势,最终慢性死亡。所谓一代版本一代强,最终的版本之子,往往都和设计者的初始目标并不一致,所以也可以看到现在基本主流的即时战略和MOBA类游戏厂商都会开立体验服,以提前获取游戏平衡性调整的资料,仅靠纸上谈兵几乎无法预测实际情况。

所以看到没,只有简单系统才做取舍,复杂系统只能做平衡,十全十美的策略并不存在。

复杂系统的危机处理之道

要处理好复杂系统的危机,首先要了解异常与错误的类型

已知异常:最具代表的已知异常就是检查性异常,一般是由用户错误或问题引起的,例如要打开一个不存在文件或者一个不合法的交易员发起的交易时,检查性异常就发生了,在实际生活中这种异常也很常见,比如我们现在乘坐飞机火车都需要查验身份证件,对付这类异常都需要有对应的预案或者处理流程。对于系统整体来讲,服务不应该因此类异常中断。

重要错误:如堆栈溢出,磁盘IO错误等等,遇到此类错误到底是立即蓝屏或者崩溃以防事态扩大。

未知错误:这种情况一般是程序存在的问题,未将系统所遇情况考虑完整,属于BUG的范围,但是未知异常和重要错误的界限往往模糊不清,出现后到底是让程序继续运行还是崩溃退出,其实就是健壮性与容错性之间的抉择。

而复杂系统的异常处理原则就是做好检查性异常的处理流程,避免因为小错误造成大影响;确定重要错误主要中断服务,避免事态扩散;同时也要根据系统类型选择对未知错误的处理方式。最后尽量提供类似于JAVA中Finally的兜底机制,以便保存好错误现场情况后续复盘。

控制系统的复杂性

我们刚刚谈内容有一个最大的前提,就是系统的复杂程度。而如果系统的复杂程度不高,那么就不会有这么多麻烦了。所以我们在实际生活中经常通过开辟新战场,寻找新领域等方式,在新兴增长点变得足够复杂之前,对于进行方向掌握,这样不断寻找增量的方式,其背后也正是的控制系统复杂程度的道理。

而近些年IT界不断兴起的模块解耦及微服务等理念,本质上也是在控制系统的复杂程度,但是我们了必须看到当新兴的增长点融入整个经济体系,微服务总体协同工作之后系统还是终究难逃复杂的命运,所以也只能拥抱复杂,拥抱不确定性,在各方之间做出平衡,才是终极之道。

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值