去重和幂等的本质就是业务Key再加上存储
代码的实现核心只有两个:频次去重和内容去重
首先主模块名为deduplication;
其下分为三个模块分别为:1.build负责构建去重参数 2.limit实现去重逻辑 3.service实现去重服务;
DeduplicationHolder 负责起到工厂作用 DedupicationParam 是去重参数DTO DeduplicationRuleService 去重入口;
工作流程:
线程池拉取到MQ中的消息后,数据会进入到Task类里run方法里面,然后进入到service入口,首先读取去重的参数配置(由分布式配置中心负责),一共定义两种去重逻辑写在DeduplicationType枚举上,然后后续获取出来负责根据去重的类型冲儿构建出我们的去重参数;
去重参数(消息信息,去重时间,去重次数,去重相关的埋点信息),通过for加强以此对消息进行去重判断,进行消息去重。
而去重和幂等的本质就是业务Key再加上存储,这里内容去重的业务Key用的是消息的ID(模板ID)再加上消息发送人(接收人)再加上他的内容(消息内容)构建的。拿到业务Key后具体的实现是通过Redis的Lua脚本进行去重,最后去重实现的算法通过zset结构实现滑动窗口