健康码生病了!

2022年1月13日,电信行程码奔溃;2022年1月10日,广东地区日常使用的粤康码和天津市核酸检测系统相继被曝系统崩溃;2021年12月25日,天津健康码出现异常;2021年12月20日,西安一码通崩溃;2021年8月2日,山东健康码卡顿;2021年5月7日及8日,澳门健康码连续两日出现异常情况;2020年5月6日,杭州健康码无法正常打开;等等。
代表社会健康,公共生活依赖的健康码为什么状况频出?到底怎么了?得啥病了?怎么治疗?

层层转包让真正干活的没有动力,没有规划好,系统压力大,接口不稳定,等等,社会给出了种种病因分析,找出了千万个理由,但都没有触及到病根,作为一个系统,真正的病因不能逃脱系统设计和技术的问题。

头条新闻广西首创,“断网可用”健康码,似乎道出了真正的病因之一。

去一个商场,大门口要刷一次健康码,几十秒钟到了商家门口,又得刷一次,而且,从健康码的行为看到,每次都需要验证身份,访问服务器,这更坚定了健康码的病因之一。

这个病因之一就是:

缓存(cache或buffer)的设计和实现有问题!
健康码的查询,不像交易,一定要求非常实时,一个人的健康状态,不会几分钟,甚至小时之内就发生巨大的变化,所以,缓存的时间的设计就应该相当的有学问,至少缓存十分钟是没有问题的,有的甚至可以更长。

如果更长的缓存时间不好确定,那么还有更先进的技术,HTTP 304: Not Modified。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供if-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。如果客户端在请求一个文件的时候,发现自己缓存的文件有Last Modified,那请中会包含if Modified Since,这个时间就是缓存文件的Last Modified,这时服务器基本就没有什么负荷。这个技术,不但减少了网络的传输带宽,而且大幅的减少了服务器的负载。
那么看看缓存怎么避免或部分治愈现在的健康码的病。

对于用户端,不管是用自有的App,还是小程序,还是支付宝应用,显然,都能提供缓存的功能,就算没有网,也能够在设定的缓存时间内,不用去访问服务器(类似于“断网可用”),这样大大减少了服务器的负载,在基本没有损失准确性的情形下,节约了时间,节约了服务器和带宽成本,还提升了用户体验。有一种情况,不同的商家可能有商家相关的二维码,这样,访问服务器的时候,需要带上商家的信息,这也不是问题,一天到过的商家的信息,不一定每次都要马上上传,可以是几个小时之内的,集中一次上传,所以和缓存并不矛盾。再配合HTTP 304:Not Modified,应该会大大减少服务器的计算负载。

对于服务端,根据UCloud的实践,现在的健康码系统包括几个部分。
用户身份验证:通过短信动态验证、人脸识别验证等形式,落实一人一码。
手机几乎是人手一个,短时间内换一个手机的概率非常之小,并不是每次扫码都需要通过短信或服务器去验证,缓存将起到关键的作用来减少负载。

号码段验证:通过手机号识别归属运营商,便于运营商短信自动化同步用户。
这个就更是一个缓存和查询的问题,哪个运营商有哪些号码,就算允许用户带号切换运营商,这个查询也不要每次都实时去问运营商,隔一段时间问一次就够了,这时缓存的时间实际可以很长的。

用户行程信息查询:根据运营商提供的用户行程情况,结合国家卫健委疫情风险数据,提供更为清晰的行程信息。红/黄/绿码的显示:依托来自于卫健、公安、通管等部门汇聚的数据,经过防控规则和数据建模,分析评估后,测算出红色、黄色、绿色三种风险状态。
后面的建模应该是批量建模,不会是用户每查询一次建模一次,这样,也提供了缓存的必要性。有了缓存,有了Not Modified协议,服务器只要看看从上次建模有没有变化。
再者,服务器要调用卫生健,公安,通管的服务接口,这些接口的调用,通用应该有一段时间的缓存,和Not Modified协议。更好的是,部门之间的数据整合,最好的方式是批量处理,比如,在零点的时候,统一批量交换数据,先缓存下来,之后的实时接口调用,就能很好的使用缓存和Not Modified协议。

疫苗/核酸信息的查询:根据卫健等部门提供的信息,便于用户即时查看接种记录及疫苗信息。
这个,通过提供缓存,和用户可以主动清除缓存的功能,就应该能很好的满足用户的需求。比如,用户打完疫苗,想马上知道自己的状态,就可以选择清楚缓存,然后,就应该能得到实时的信息。用户自己都知道没有变化,为啥每次要去服务器查询,而不是利用缓存呢。
有人可能会说,大量使用缓存,尤其是长时间的缓存,会有安全问题。也许会有一点,但是,健康码不是一个实时的和钱相关的交易系统,允许一点不一致,问题应该不是很大。如果有人故意去作弊系统,除了技术上防范,后面还有法律在监督。

缓存,就是给健康码看完病之后,开出的一剂良药,希望能治愈或部分治愈健康码的奔溃之病。
继续阅读
阅读原文