业务实战场景(二十一) 健康码系统设计

目录

  • 背景
  • 健康码设计
    • 最初设计
    • 替换数据库
    • 使用布隆过滤器
    • 预置过滤器
    • 利用内容分发网络
  • 压测以及可观测性
  • 参考文章

背景

  • 本文旨在探讨如何设计一个低成本、高可靠性的健康码服务系统,以应对快速识别风险人群的需求
  • 健康码系统的功能需求,包括查询和更新两个基本操作。性能需求方面,以省为单位,假设支持1亿用户的日常查询,若用户平均每天查询 10 次(早 8 点到晚 8 点),则吞吐率约为 24 千次/秒(100,000,000*10/12/3600)。假设峰值为平均值的 10 倍,则系统需要支持的最高吞吐率为 240 千次/秒。用户身份证号为 18 位,用字符串存储需要 36 字节,用数字存储需要 8 字节。相对于网络协议报头来讲几乎可以忽略不计。假设单个请求消息为 200 字节,则峰值访问带宽为 240000 * 200 * 8 bps = 384 Mbps,保守估计 400 Mbps 带宽可以满足
  • 查询是系统最难的部分,因为风险者比率较小,这是一个稀疏数据查询问题

健康码设计

  • 逐步优化:
  1. 替换数据库:使用NoSQL类数据库如Redis,减少服务器数量,降低成本
  2. 使用布隆过滤器:利用布隆过滤器的特性,减少误判,提高查询性能
  3. 预置过滤器:将过滤器下载到客户端本地,减少带宽需求,降低成本
  4. 利用内容分发网络(CDN):通过CDN提前缓存数据,减少更新数据时的带宽占用
  5. 分布式网络应用:采用P2P网络,让客户端之间直接传输数据,进一步降低服务器压力
  • 通过选择合适的数据库和系统优化,可以将服务器数量降低到原来的10%,使用布隆过滤器实现单机支撑海量查询请求,客户端预置过滤器降低了服务器压力为原来的1%,结合CDN和P2P技术,提升了系统的可扩展性和可靠性,最终将日均成本降低到1元人民币
  • 在实际生产中,还需要考虑负载均衡、安全防范、隐私保护等方面的问题,还需要完善的压测机制,下面详细介绍各个设计的思路

最初设计

  • 选用常见开源实现 MySQL,容易实现单机千次每秒查询。应用常见优化手段(缓存、索引、内存引擎等)后,即可实现单机超过万次每秒查询性能
  • 粗略估计整体系统需要 24 台服务器。以租用公有云虚拟机为例,4 核 8 G 虚拟机的日均价格不到 1 元人民币,24 台共计 24 元。400 Mbps 带宽的每天费用约为 1000 人民币


    直接读取数据库.png

替换数据库

  • 由于查询仅需要确认某数据是否存在,并且数据量不大,对读写一致性容忍度较高,因此可以考虑替换为 NoSQL 类数据库如 Redis。普通服务器上 NoSQL 类数据库的查询可以达到 10万qps,成功将服务器数量减少为 3 台

使用布隆过滤器

  • 布隆过滤器特性十分适合判断风险人群的情况。假如布隆过滤器认为某人无风险(大部分情况下),则必然是无风险;如果认为有风险,可以再通过数据库来进行确认。存储一百万条数据,误判率为 3% 时,布隆过滤器只需要 1 MB 大小内存数据结构,查询性能可以轻松达到百万次。此时,只需要 1 台服务器即可轻松处理所有查询


    使用布隆过滤器.png

预置过滤器

  • 服务器数量从 24 台优化到了 1 台,但是总体费用几乎没下降,这是因为带宽费用占了绝大部分成本。最直接的思路就是干脆把过滤器下载到客户端本地。这样绝大多数无风险用户通过本地查询即可得到结果,只有少数风险用户和误判用户需要发到服务器进行处理

利用内容分发网络

  • 当客户端预置的过滤器需要更新时,还是会占用不少的网络带宽。这就轮到内容分发网络CDN出场了。更进一步还可以使用P2P

压测以及可观测性

  • 构建完整的监控体系,提前预警业务事件,提升系统SLA
  • 可观测体系: 可观测能力是运维中不可或缺的一部分,帮助及时发现故障并加速故障恢复。通过基础组件、业务指标、用户体验和业务拨测等多个维度构建可观测体系
  • 预估业务量并进行扩容,完成性能压测。压测过程中解决瓶颈问题,如单核跑满、负载过高、防火墙故障等
  • 架构需要具有自保护能力和对后端应用的保护能力,如增加队列、缓存、限流等
  • 变更控制对保持业务稳定运行至关重要,变更请求需经过严格评审和授权后实施

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容