在软件系统架构和实现领域,大家都比较注重高可靠性、高性能、高并发。今天我想从另外一个维度说说软件系统架构与实现,那就是高可控性。为什么高可控性如此重要?因为一旦一个系统失去控制,就没有人能够评估出会产生什么样的结果。例如一个海量数据传输系统,如果不能对流量进行很好的控制,那么当大数据量来时可能把某台集群网络打满,也可能把一个交换机的网络io打满,也有可能把整个机房网络打满,导致整个机房瘫痪。
今天我就从系统架构和代码两个层面说说怎样做到高可控性。第一,作为一个合格的系统架构师在做架构设计时,不能只把能够实现功能的架构设计出来就可以了,还必须要考虑到每一个模块出现各种问题所面临的场景,针对这些场景做容错设计。当然不是所有的问题都能够有容错方案,但是自己心里一定要清楚出现问题所带来的后果和怎样快速的解决问题,恢复系统。例如某一个模块出现问题不可用了,是会影响系统的主要功能还是辅助功能,如果是主要功能是否需要ha方案,如果是辅助功能是否可以直接降级等。一句话,在整个系统中每一种异常情况和问题都能够在你的掌控范围之内。第二,代码层面的可控性。这一点主要针对编写代码的实现者,你必须要对某一行代码可能带来的效果和问题都需要有充分的理解。很多人可能会问,自己写的代码肯定知道怎么回事。我看未必,很多人写代码只考虑把功能实现,其实不知道这些代码背后在不同场景下是有不同表现的。例如内存不够了,你申请内存失败;写文件由于锁阻塞了;发送网络io数据,网络掉线了等 这些都还是最基本的异常情况,更深入或者更难的是,现在大家都用成熟的开发库和框架,大部分人只掌握这些代码库和框架的基本功能,不理解背后的实现原理,可能在某种情况下就不是我们预期的结果。这些问题经常出现在代码库和开发框架本身有bug的情况下,只是在特殊场景触发而已。所以要对代码的绝对可控需要掌握的东西也很多,但这就是区分大牛和菜鸟的本质内容。对系统架构和代码绝对的高可控性有什么好处?其实是显而易见的,没有任何系统不出问题。但是出现问题以后你能不能马上的控制住局面并且快速的解决这就要看你对系统和代码的可控性程度了。
在现实工作中,很多系统出现小问题,由于对系统不可控,导致问题的进一步扩大,也由于对系统不可控很久都找不到问题,更不用说解决问题了。对代码不可控,出现问题时只能慢慢的去重新看代码,做各种假设和验证。但是话说回来,要对整体系统架构和代码可控也不是那么简单,因为现在系统架构用到太多的开源系统,要对这些开源系统很好的掌握本身就很难,你的系统架构在各个操作系统之上,操作系统也可能出现问题。代码级别的也一样存在各种困难。所以要做到尽可能对系统可控,需要我们掌握更多的技能和知识,这也是菜鸟到大牛的转变过程。