# 《Seckill秒杀系统》第111章:实现基于黑名单机制防刷

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:实现秒杀系统基于黑名单机制的防刷方案,掌握秒杀系统基于黑名单机制的防刷原理,并能够将基于黑名单机制防刷的落地方案和实现方式灵活应用到自身实际项目中。

大家好,我是冰河~~

基于限流的方式来防刷,在实现上比较简单粗暴,并且也是最直接的一种实现方式,能够有效的解决针对单个接口的刷单流量问题,但是基于限流机制的防刷不能解决按顺序访问接口的问题。随后,我们又实现了基于Token编排的防刷方案。

# 一、前言

在前面的文章中,我们实现了基于条件限流机制防刷与基于Token编排机制防刷,但是这两种防刷机制存在一个问题:哪怕系统已经识别出了刷单流量,但是这两种刷单机制还是不能彻底拦截掉刷单流量,为此,我们需要实现基于黑名单机制的防刷。

# 二、本章诉求

在流量网关层实现基于黑名单机制的防刷功能,掌握基于黑名单机制的防刷原理与实现流程,并能够将基于黑名单机制的防刷落地方案灵活应用到自身实际项目中。

# 三、黑名单流程

基于条件限流机制防刷与基于Token编排机制防刷都不能完全拦截刷单流量,所以,我们可以实现黑名单机制的防刷功能。主要就是利用Lua共享缓存功能,去统计一段时间窗口内某个用户或者IP的请求频率,如果请求的频率达到设定的阈值,就可以认为这是刷单流量,将其放入黑名单。被放入黑名单的用户或者IP访问接口时,会被拦截。

黑名单功能可以被所有的接口共享,一旦某个用户或者IP被拉进黑名单,这个用户或者IP访问所有接口时,都会被拦截,这样,就能够将刷单流量挡在秒杀系统之外。

黑名单机制防刷的流程如图111-1所示。


可以看到,客户端在访问秒杀系统时,首先会经过流量网关,而黑名单机制防刷功能就是在流量网关中实现的,具体流程如下所示。

(1)客户端访问秒杀系统,请求经过流量网关时,会校验当前用户或者IP是否在黑名单。

(2)如果当前用户或者IP在黑名单,则拦截请求,直接返回,否则执行第(3)步。

(3)校验当前用户或者IP的请求是否触发黑名单规则。

(4)如果当前用户或者IP的请求触发了黑名单规则,则加入黑名单,回到第(2)步,否则执行第(5)步。

(5)执行实际接口的业务逻辑。

# 四、实现黑名单防刷

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码