详谈布隆过滤器在亿级流量电商系统的应用
!!! 本文已参与「新人创作礼」活动,一起开启掘金创作之路。更多干货文章,可以访问 菜鸟厚非
简介
布隆过滤器在实际中发挥着非常重要的作用,一呢可以防止网站被攻击,二呢可以提高系统的性能。接下来我们通过实际案例进行讲解。
案例详解
例如在电商平台,下面商品访问的地址为 https://item.jd.com/ 857.html,其中 857 是商品的 SKU 。不明白的同学可以简单理解为一个数字对于不同的商品。 接着我们来看一个正常的流程,用户访问商场,应用程序从 Redis 拿取数据,如此此时没有,则会到数据库里面拿取。 此时我们的缓存服务器缓存了 1-1000 的商品,且用户访问都是正常状态。但在当前的设计下有个致命的问题,0-1000 是存在的数据,但这些之外商品不存在。 恰逢今年双十一,突然遭到了攻击,不法分子通过改变商品的 SKU 进行频繁访问,且访问的商品还是不存在的。
此时这些产品在缓存中是不存在,而且数据库也是不存在,大量的请求都会到 DB ,大家都是数据库在短时高并发情况下,承载能力是并不行的。这时就会引起系统瘫痪,这在电商系统是非常非常严重的事情。
这种绕过 Redis 服务器,直接查询 DB 的攻击方式,称之为缓存穿透攻击。下面我们进行讲解
缓存穿透
什么是缓存穿透
缓存穿透攻击是指恶意用户在短时内大量查询不存在的数据,导致大量请求被送达数据库进行查询,当请求数量超过数据库负载上限时,使系统响应出现高延迟甚至瘫痪的攻击行为。
同学们不要小看这种攻入,如果感到像 618 双十一 等这样的节日活动,造成的损失可以不可估量的。
如何预防缓存穿透
要想预防缓存穿透,可以使用布隆过滤器。那什么是布隆过滤器呢?
巴顿.布隆于一九七零年提出的,其主旨是采用一个很长的二进制数组,通过一系列的Hash函数来确定该数据是否存在。如下图
此时我们将 1-1000 商品初始化到布隆过滤中。如下图
我们对 858 商品在布隆过滤器中进行判断,可以看到布隆过滤器的判断过程,可以看到所处位全部是1。如下图
接着对不存在的商品 8888 进行布隆过滤器判断,可以看到某些位为 0 说明,此商品是不存在的。
如果当前是缓存穿透攻击,判断没有后,直接返回结果,就不用再进行查询,有效的阻挡了非法请求。
误判情况
布隆过滤器并不是100%可以判断出是否存在,可以通过增加二进制数组位数、增加Hash次数来减少误判率。
通过例子解释什么是误判,商品 8889 在数据库是不存在的,但 hash 位全部是 1 ,之后就会进行查询操作,这种就是误判。
有的同学会疑问误判了会怎么样,布隆过滤在设计之处就存在的误判情况,且误判可以优化到 1% ,如果面对攻击 10000 次也就只有 100 会误判,这种影响是不大的,在可接受范围内。
项目中使用流程
布隆过滤与数据一致性
- 解决方案 定时异步重建布隆过滤器
- 解决方案 计数Bloom Fliter