1月10日上午,广东省的粤康码突然访问异常,给很多正在上班的人带来诸多不便。
事后,粤康码发布公告称,“10日上午8:31,平台监测到粤康码流量异常增大,最高达每分钟140万次,超出承载极限,触发系统保护机制,导致部分用户访问粤康码缓慢或异常,运行保障团队紧急处置,于9:04部分缓解,9:56完全恢复顺畅运行”。
一周前,西安一码通更是在短短半个月内连续两次崩溃。2021年12月20日早上,西安一码通出现访问异常,修复工作持续一整天;2022年1月4日上午,西安一码通再次崩溃,至中午恢复正常。
第一次故障,西安官方给出的回复是“每秒访问量达到以往峰值的10倍以上,造成网络拥塞”,而第二次故障,同样是因为“访问量过大”。
近两年,随着疫情防控进入常态化,健康码已成为人们出行的一个“必需品”。这导致健康码一旦出现问题,也会给人民群众的生活带来较大影响,尤其是像西安,正处于抗击疫情的关键时刻,健康码的失灵也直接妨碍了防疫工作的开展。
有了前车之鉴,各地政府亟需思考的一个重要问题是——如何防止健康码出现崩溃。
安全与效率的博弈
不过,行业专家李明告诉21世纪经济报道,如果从技术的角度,健康码运营支持已经非常成熟,但面对突如其来的访问压力,保证百分之百的不出现问题并不现实。
且不说从理论上,就不存在绝对稳定的系统,从目前健康码最常见的崩溃原因——流量过载来看,这背后尚存在效率、成本、安全的博弈问题。
李明表示,一般的系统架构都存在承载阈值,当用户流量超过这个阈值,系统便会出现崩溃。实际上,这个问题在很多产品中都出现过,比如此前的微博,便多次遇到因某明星突然曝出八卦新闻,用户量瞬时增加导致产品崩溃。
很多人会好奇,那为什么不提高这个阈值,避免出现过载情况?这便涉及到访问效率和成本的平衡问题。因为提高阈值,需要更多的服务器,也意味着更多的成本。
李明透露,以健康码为例,承载千万人口的访问需要的成本大概是千万级别。假如一个城市健康码日常的并发量峰值只有10万,为此却准备50万并发量的服务器,也会造成资源浪费。
所以在实际操作中,每个城市的健康码都会根据当地情况,设置一个合理的阈值,至少能保证日常的使用。但这也会留下一个隐患,即当地居民集中大规模使用健康码时,便会导致用户流量超出阈值。
虽然是小概率事件,但这也说明健康码因为突然的流量增加出现崩溃,也算是一个意料之中的事情。因此,真正要解决的问题应该是,系统出现过载之后,能否快速恢复。
李明称,从技术的角度,目前也已经具备了快速应对的能力。其提到了几个设计原则:
首先在设计系统架构的时候,要考虑极端情况,比如某城市人口1000万,那架构设计就至少要考虑到1000万人可能出现的极端情况。
在架构之下,要具备弹性伸缩的能力。比如平时只需要使用100台服务器,在遇到特殊情况时,100台服务器不够用了,需要支持快速弹性扩展。这个场景其实也是云计算的一项核心能力,目前也十分成熟。
另外,系统也需要做灾备。这是确保用户访问出现过载且弹性伸缩能力没有发挥作用的情况下,至少有一套备案可以及时启用。
除此之外,像是对系统流程进行解耦,把整个业务过程分割成不同层级,防止流量集中涌入;或者是通过分布式的架构,将流量拆分到不同处理区。这些都能够有效避免整个系统的崩溃。
西安一码通的警示
所以,健康码遇到问题并不可怕,只要能快速恢复,便基本能满足群众所需。但西安一码通这次备受关注,一方面是第一次崩溃时间长达一天,另一方面则是短时间内连续出现两次问题。
按照上文提到的一些解决方案,西安一码通在第一次遇到访问量过载的时候,正常的操作应该是通过弹性伸缩的方式来应对,但一码通系统最终崩溃,这说明在系统架构上,设计之初没有充分考虑负载均衡和弹性伸缩的情况。
据钛媒体App从一位接近西安“一码通”项目人士处获悉,整个故障的大致原因已基本清晰,就是一起因流量过载、系统架构应对高并发不足,最终导致防火墙拦截数据无法返回的系统性故障。
李明向记者表示,防火墙也有吞吐量的限制,如果流量太大超出吞吐量上限,那防火墙也将无法响应。正常来说,防火墙也应该有负载均衡机制,当一个防火墙无法支撑的时候,就启用其他防火墙分担其流量。
当然,这个背后又涉及到公有云和私有云的问题。李明称,目前整个政务市场都倾向于使用私有云,如果防火墙是私有云架构,那灾备的防火墙平时即使不用,买来也需要成本,但这个成本往往不能省。
系统架构无法满足快速扩容,这也造成西安一码通遇到高并发的流量时,处理能力变得僵化。至于为何出现这样的情况,李明认为,这说明整个系统在设计时,就没有充分考虑到各种可能出现的情况。而且在已经出现全城范围的疫情防控时,也应该提前做系统的抗压力测试和演练准备。
此外,有些地区的健康码建设的分包情况,也出现了一些不合理的问题。一般而言,作为总包商,核心模块不应该再分包出去。
这里的核心模块包括整个健康码的接入、生成、验码等关键引擎。“当然,至于其他一些简单的业务模块,分包出去是没问题的,几乎所有健康码项目,也都存在分包的情况”,李明说。
对于健康码项目,李明认为,首先要明确项目的边界,比如承载的并发量是多大,遇到突发情况能容忍的处理时间是多少;
其次,要有严格的审查机制。整个系统架构要经过认真的审查,并且审查人员应该实行终身负责制,而不是走个形式,导致出现问题不知道找谁;
然后是在招标执行的时候,要确保投标公司有足够的能力,这时候不光要看他们承诺的能力,更要看他们做过哪些案例;
最后是有预警机制,比如当流量达到峰值的一定比例时,就要提前启动预案。再比如某地突发局部疫情,这时候也要提前采取措施。
西安一码通因两次崩溃而引发的巨大舆论,已给其他地方政府敲响了警钟。比如北京在近日的防控疫情工作会议上便提出,用好“北京健康宝”,加强压力测试和系统运行维护,确保正常运行。
在疫情反复无常的常态下,我们希望健康码不要出现任何异常,如果发生了异常,也希望能够以最快的速度恢复,而不是让人们等待一天甚至半天那么久。