古法编程 布隆过滤器:理论、工程权衡与 Go 语言实现网页链接 “在我们的一条推荐流水线中,有一个简单的需求,那就是不能向用户展示他们已经浏览过的文章。在流量峰值时,Feed 服务每秒处理约 18000 个请求,每个请求需要评估约 120 个候选内容。这意味着每秒需要执行约 216 万次检查。然而,该工作负载分布极不均匀,大约 97%-98% 的检查结果都是用户未浏览。
我们最初的设计是对每个候选内容执行精确查询(缓存 + 后端存储)。该方案功能上可行,但是在大量查询结果都是否定结果的项目中效率较低。每次未命中仍然会产生网络与存储开销,导致 I/O 上升。在流量高峰期,这表现为 p95 延迟升高(从约 85ms 升至 140ms)、后端读取请求激增,以及基础设施成本持续上涨。
为了解决该问题,我们在精确查询路径前引入了布隆过滤器(Bloom filter)。过滤器在内存中能够直接排除确定不存在的项目,只将可能存在的项目提交给高开销的验证流程。这一改动让我们避免了对确定不存在的项目执行无效操作,同时降低了延迟与后端负载。通过提前过滤确定的未命中项,我们可以将资源集中在真正需要验证的场景上。
本文将完整讲解该实现方案,涵盖了架构问题、布隆过滤器的原理、Go 语言集成、带数学计算的参数调优(m 和 k),以及在生产环境约束下落地该方案的实践经验。”