解剖屎山,寻觅黄金之第二弹

大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。austin支持两种去重的类型:N分钟相同内容达到N次去重和一天内N次相同渠道频次去重。

在最开始,我的第一版实现是这样的:

publicvoidduplication(TaskInfotaskInfo){//配置示例:{"contentDeduplication":{"num":1,"time":300},"frequencyDeduplication":{"num":5}}JSONObjectproperty=JSON.parseObject(config.getProperty(DEDUPLICATION_RULE_KEY,AustinConstant.APOLLO_DEFAULT_VALUE_JSON_OBJECT));JSONObjectcontentDeduplication=property.getJSONObject(CONTENT_DEDUPLICATION);JSONObjectfrequencyDeduplication=property.getJSONObject(FREQUENCY_DEDUPLICATION);//文案去重DeduplicationParamcontentParams=DeduplicationParam.builder().deduplicationTime(contentDeduplication.getLong(TIME)).countNum(contentDeduplication.getInteger(NUM)).taskInfo(taskInfo).anchorState(AnchorState.CONTENT_DEDUPLICATION).build();contentDeduplicationService.deduplication(contentParams);//运营总规则去重(一天内用户收到最多同一个渠道的消息次数)Longseconds=(DateUtil.endOfDay(newDate()).getTime()-DateUtil.current())/1000;DeduplicationParambusinessParams=DeduplicationParam.builder().deduplicationTime(seconds).countNum(frequencyDeduplication.getInteger(NUM)).taskInfo(taskInfo).anchorState(AnchorState.RULE_DEDUPLICATION).build();frequencyDeduplicationService.deduplication(businessParams);}


(资料图)

那时候很简单,基本主体逻辑都写在这个入口上了,应该都能看得懂。后来,群里滴滴哥表示这种代码不行,不能一眼看出来它干了什么。于是怒提了一波pull request重构了一版,入口是这样的:

publicvoidduplication(TaskInfotaskInfo){//配置样例:{"contentDeduplication":{"num":1,"time":300},"frequencyDeduplication":{"num":5}}Stringdeduplication=config.getProperty(DeduplicationConstants.DEDUPLICATION_RULE_KEY,AustinConstant.APOLLO_DEFAULT_VALUE_JSON_OBJECT);//去重DEDUPLICATION_LIST.forEach(key->{DeduplicationParamdeduplicationParam=builderFactory.select(key).build(deduplication,key);if(deduplicationParam!=null){deduplicationParam.setTaskInfo(taskInfo);DeduplicationServicededuplicationService=findService(key+SERVICE);deduplicationService.deduplication(deduplicationParam);}});}

我猜想他的思路就是把构建去重参数和选择具体的去重服务给封装起来了,在最外层的代码看起来就很简洁了。后来又跟他聊了下,他的设计思路是这样的:考虑到以后会有其他规则的去重就把去重逻辑单独封装起来了,之后用策略模版的设计模式进行了重构,重构后的代码 模版不变,支持各种不同策略的去重,扩展性更高更强更简洁

确实牛逼。

我基于上面的思路微改了下入口,代码最终演变成这样:

publicvoidduplication(TaskInfotaskInfo){//配置样例:{"deduplication_10":{"num":1,"time":300},"deduplication_20":{"num":5}}StringdeduplicationConfig=config.getProperty(DEDUPLICATION_RULE_KEY,CommonConstant.EMPTY_JSON_OBJECT);//去重ListdeduplicationList=DeduplicationType.getDeduplicationList();for(IntegerdeduplicationType:deduplicationList){DeduplicationParamdeduplicationParam=deduplicationHolder.selectBuilder(deduplicationType).build(deduplicationConfig,taskInfo);if(Objects.nonNull(deduplicationParam)){deduplicationHolder.selectService(deduplicationType).deduplication(deduplicationParam);}}}

到这,应该大多数人还能跟上吧?在讲具体的代码之前,我们先来简单看看去重功能的代码结构(这会对后面看代码有帮助)

去重的逻辑可以统一抽象为:在X时间段内达到了Y阈值,还记得我曾经说过:「去重」的本质:「业务Key」+「存储」。那么去重实现的步骤可以简单分为(我这边存储就用的Redis):

通过Key从Redis获取记录

判断该Key在Redis的记录是否符合条件

符合条件的则去重,不符合条件的则重新塞进Redis更新记录

为了方便调整去重的参数,我把X时间段和Y阈值都放到了配置里{"deduplication_10":{"num":1,"time":300},"deduplication_20":{"num":5}}。目前有两种去重的具体实现:

1、5分钟内相同用户如果收到相同的内容,则应该被过滤掉

2、一天内相同的用户如果已经收到某渠道内容5次,则应该被过滤掉

从配置中心拿到配置信息了以后,Builder就是根据这两种类型去构建出DeduplicationParam,就是以下代码:

DeduplicationParamdeduplicationParam=deduplicationHolder.selectBuilder(deduplicationType).build(deduplicationConfig,taskInfo);

Builder和DeduplicationService都用了类似的写法(在子类初始化的时候指定类型,在父类统一接收,放到Map里管理)

而统一管理着这些服务有个中心的地方,我把这取名为DeduplicationHolder

/***@authorhuskey*@date2022/1/18*/@ServicepublicclassDeduplicationHolder{privatefinalMapbuilderHolder=newHashMap<>(4);privatefinalMapserviceHolder=newHashMap<>(4);publicBuilderselectBuilder(Integerkey){returnbuilderHolder.get(key);}publicDeduplicationServiceselectService(Integerkey){returnserviceHolder.get(key);}publicvoidputBuilder(Integerkey,Builderbuilder){builderHolder.put(key,builder);}publicvoidputService(Integerkey,DeduplicationServiceservice){serviceHolder.put(key,service);}}

前面提到的业务Key,是在AbstractDeduplicationService的子类下构建的:

而具体的去重逻辑实现则都在LimitService下,{一天内相同的用户如果已经收到某渠道内容5次}是在SimpleLimitService中处理使用mget和pipelineSetEX就完成了实现。而{5分钟内相同用户如果收到相同的内容}是在SlideWindowLimitService中处理,使用了lua脚本完成了实现。

LimitService的代码都来源于@caolongxiu的pull request,建议大家可以对比commit再学习一番:https://gitee.com/zhongfucheng/austin/pulls/19

1、频次去重采用普通的计数去重方法,限制的是每天发送的条数。

2、内容去重采用的是新开发的基于redis中zset的滑动窗口去重,可以做到严格控制单位时间内的频次。

3、redis使用lua脚本来保证原子性和减少网络io的损耗

4、redis的key增加前缀做到数据隔离(后期可能有动态更换去重方法的需求)

5、把具体限流去重方法从DeduplicationService抽取出来,DeduplicationService只需设置构造器注入时注入的AbstractLimitService(具体限流去重服务)类型即可动态更换去重的方法 6、使用雪花算法生成zset的唯一value,score使用的是当前的时间戳

针对滑动窗口去重,有会引申出新的问题:limit.lua的逻辑?为什么要移除时间窗口的之前的数据?为什么ARGV[4]参数要唯一?为什么要expire?

A: 使用滑动窗口可以保证N分钟达到N次进行去重。滑动窗口可以回顾下TCP的,也可以回顾下刷LeetCode时的一些题,那这为什么要移除,就不陌生了。

为什么ARGV[4]要唯一,具体可以看看zadd这条命令,我们只需要保证每次add进窗口内的成员是唯一的,那么就不会触发有更新的操作(我认为这样设计会更加简单些),而唯一Key用雪花算法比较方便。

为什么expire?,如果这个key只被调用一次。那就很有可能在redis内存常驻了,expire能避免这种情况。

推荐项目

最后再叨叨吧,很多人可能会发一段截图,跑来问我为什么要这样写,为什么要以这种方式实现,能不能以这种方式实现。这时候,我更想看到的是:你已经实现了第二种方式了,然后探讨你写的这种方案好不好,现有的代码差在哪里。

毕竟问问题很简单,我又不是客服,总不能没诚意的问题我都得一一回答吧。

如果想学Java项目的,我还是强烈推荐我的开源项目消息推送平台Austin,可以用作毕业设计,可以用作校招,可以看看生产环境是怎么推送消息的。

仓库地址(可点击阅读原文跳转):https://gitee.com/zhongfucheng/austin

我开通了股东服务内容,感兴趣可以点击下方看看,主要针对的是项目哟

VIP服务

标签:

天天快资讯:饥饿动物好玩吗 饥饿动物玩法简介

期待已久的手游饥饿动物即将登陆九游,这款手机游戏吸引了大批玩家的关

06-04 06:59:02

618HiFi耳机内卷性价比—兴戈SIMGOT EW200耳机杂谈

今年很多耳机厂家都开始完善自己的产品线,不少品牌都开始技术下放,给

06-04 06:10:54

饼状图怎么做整体的百分比-饼状图怎么做

1、新建PPT后,点击插入——图表,会弹出excel窗口。2、2 在弹出的exce

06-04 04:53:55

用友t3怎样生成报表_用友t3怎么生成财务报表

1、打开用友T3财务软件,依次点击“总账”菜单-设置-选项-其他,查看行

06-04 02:48:03

环球热门:官山邸_关于官山邸介绍

1、官山邸位于杭州市临安临安,由临安成龙房地产开发有限公司建成,总

06-04 00:44:01

完美数python编程(完美数)

今天小编岚岚来为大家解答以上的问题。完美数python编程,完美数相信很

06-03 23:05:47

种族 民族 族群的概念及三者的联系与区别在于_种族 民族 族群的概念及三者的联系与区别

1、种族又称做人种,是在体质形态上具有某些共同遗传特征的人群。2、 

06-03 21:51:22

脑活素片有什么副作用吗_脑活素片说明书

1、德国公牛牌强力脑活素,乃最新研制的对脑部神经有极大舒缓作用的治

06-03 20:23:21

“阿米巴经营模式”,各有利弊吧 环球快播报

@晏凌羊:合伙人新近认识的一个同学(合伙人读了一个学费近百万的北大

06-03 19:17:42

世界速看:华夏聚盈优选三个月持有混合FOF成立

6月3日华夏聚盈优选三个月持有混合FOF公告称,该基金于6月2日成立,首

06-03 18:43:53

B站高管解读电话会议:没有UP主停更潮 净亏将进一步收窄

雷递网雷建平6月2日B站昨日发布财报。财报显示,B站2023年第一季营收51亿。B站2023年第一季日均活跃用户937

06-03 17:53:17

即时看!洛克王国小罗王在哪里_洛克王国罗隐在哪抓

1、罗隐是阿米亚特进化的,可以在拉布朗矿山口、铜矿场里捕捉(望楼主采纳)罗隐是阿米亚特进化的、、、在

06-03 16:58:29

【全球聚看点】王宝强,又被绿了?

总裁管理学府读懂10000种创业赚钱的生意▼长按下方↓↓↓二维码进群来源:网络,侵删王宝强再次因为女人登

06-03 16:00:38

文旅部郑重声明:从未组织公开招聘沙特未来城志愿者

据文旅部网站消息称,近日,有不法分子谎称受沙特旅游局委托公开招聘沙特未来城项目推广志愿者,文化和旅游

06-03 15:30:11

华硕Zenfone 9泄漏揭示了带有云台相机的紧凑型旗舰

在过去的几个月里,我们已经看到了一些所谓的华硕Zenfone9泄漏事件,但可信的细节很少,而且相差甚远。现在

06-03 14:13:53

离职对公司建议怎么写_离职对公司的意见和建议

1、可以提出一些改进的建议:领导与各级员工缺乏实际的沟通。2、企业领导应与各级员工建立和谐的交流和沟通

06-03 12:26:45

苹果WWDC23将推新一代MacStudio 6月6日公开! 天天亮点

业界知名的记者马克·古尔曼最近发推称,苹果将会在WWDC2023开发者大会上公开新款MacStu

06-03 12:00:31

天天热门:龙口南山双语学校附近楼盘_龙口南山双语学校

1、何佳庠先生,国内知名教育专家,中国数学学会会员,数学奥林匹克高级教练,首批“全国优秀教师”,绵阳南...

06-03 10:59:12

兵藤一诚结局(兵藤一诚)

来为大家解答以下的问题,藤一诚结局,兵藤一诚这个很多人还不知道,现在让我们一起来看看吧!1、兵藤一诚的

06-03 09:51:36

江苏卫视勇者大冲关报名费 江苏卫视勇者大冲关_天天热推荐

1、江苏卫视勇者大冲关女主持人有好几个分别是陈烁,成雁南,孙倩。2、陈超,连莲等男主持有徐文,程易等百

06-03 09:13:54

6月2日基金净值:嘉实泰和混合最新净值3.241,涨0.9%

6月2日,嘉实泰和混合最新单位净值为3 241元,累计净值为7 78元,较前一交易日上涨0 9%。历史数据显示该基

06-03 08:21:20

【汽车零部件】汽车行业点评报告:5月新势力销量环比普遍增长,埃安、理想表现亮眼|世界今热点

5月新势力交付量环比普遍增长,埃安、理想表现亮眼5月,理想汽车交付量为28,277辆,同 环比分别为+146% +10

06-03 07:22:39

捐赠小书包 托起大梦想——爱心书包捐赠活动在百纳乡草坪小学开展|环球快看

(通讯员汪沙段墨)“六一”儿童节当天,“童心向党放飞梦想”关爱儿童志愿服务活动在百纳乡草坪小学开展...

06-03 06:23:45

今热点:维护校门口交通安全,当做到防患于未然

维护校门口交通安全,当做到防患于未然原标题:维护校门口交通安全,当做到防患于未然5月31日早上8时左右,

06-03 06:01:26

肖战为什么被主流媒体认可(肖战为什么被全网黑)-当前热闻

1、像肖战这种流量艺人存在不理智的粉丝是很正常的,此前粉圈文化一直都在各大平台存在。2、这些粉丝组成的

06-03 05:21:44

世界简讯:学会计专业的考CFA好考吗?详见分析优势

学会计专业的考CFA好考吗?学会计专业的人考CFA证书是有一定优势的,但并不代表就一定好考。CFA(CharteredF

06-03 04:04:48

快资讯:年假折算公式excel_年假折算公式

1、职工带薪年休假条例第三条规定,职工累计工作已满1年不满10年的,年休假5天;已满10年不满20年的,年休

06-03 03:21:40

【环球快播报】西安全力以赴打好“三夏”攻坚战

针对多轮降水给全市夏粮生产带来的严重影响,全市各级不等不靠、积极应对,科学研判,精准调度,全力抢收。

06-03 01:57:37

“牢记嘱托 感恩奋进” 眉山东坡开展主题团日、队日活动 快资讯

“六一”儿童节,眉山市东坡区在永丰村举办“牢记嘱托感恩奋进”主题团日、队日活动。活动现场(央广网...

06-03 00:57:42

言情小说照进现实?沙特富商千金与约旦王储举办皇室婚礼_天天快资讯

言情小说照进现实?沙特富商千金与约旦王储举办皇室婚礼“他,是中东最古老的君主制国家之一的王位继承...

06-03 00:20:11

苦心孤指的意思是什么 苦心孤指的意思

今天来聊聊关于苦心孤指的意思是什么,苦心孤指的意思的文章,现在就为大家来简单介绍下苦心孤指的意思是什

06-03 00:19:05

每日热门:供职十余年被认定“不称职”?!青岛农商行原行长刘宗波辞职原因成谜

前脚刚离职,后脚就被老东家评为“不称职”?日前,青岛农商行发布2022年度股东大会会议材料,内容显示...

06-02 23:31:20

高考前心理调适指南请查收是什么情况

高考前心理调适指南请查收今天的热度非常高,现在也是在热搜榜上了,那么具体的高考前心理调适指南请查收是

06-02 22:03:24

梅西美洲杯冠军2021(梅西5届美洲杯数据)

每日小编都会为大家带来一些知识类的文章,那么为大家带来的是梅西5届美洲杯数据方面的消息知识,那么如果

06-02 21:30:28

已发生8起起火事故!这一知名车企宣布,紧急召回!

当地时间5月31日,捷豹路虎公司宣布,将召回在美国市场上售出的6000多辆纯电动SUV,原因是这一车型所用的高

06-02 20:32:59

《小镇索雷斯》中文版首度引进 讲述北方小镇上三个人的悲欢故事

工人日报—中工网记者陈俊宇近日,译林出版社推出加拿大作家玛丽·劳森的长篇作品《小镇索雷斯》。这部...

06-02 19:52:19

每日快看:全新2020奥迪Q4可能会有多种发动机选择

奥迪确认将在2020年投产一款名为Q4的紧凑型SUVcoupe。对于即将到来的第三季度更换,这种新的更时尚的选择估计要

06-02 19:55:47

6月2日白银晚评:聚焦晚间非农数据 银价回升看涨|环球微速讯

北京时间周五(6月2日)亚洲时段,白银行情低开高走,一路上涨至日内高点后展开回落,欧市盘中回落走弱较长时

06-02 18:00:33

巴特勒仅得13分 创个人今年季后赛单场新低_焦点快播

NBA总决赛G1,热火93-104不敌掘金,大比分0-1落后。本场比赛,巴特勒状态一般。他出战38分钟,投篮14中6,

06-02 17:17:04

每日观察!世联赛中国女排3-0挫德国连赢两场 李盈莹夺14分

原标题:世联赛中国女排3-0挫德国连赢两场李盈莹夺14分央视网消息:北京时间6月2日,2023年世界女排联赛日

06-02 17:01:17

全球热门:酷盈网最新2023清退消息:回款步骤及清退最新进展通知终于来了!

听说最近酷盈网迎来全面清退的消息,消息称正式清退所有出借人,兑付回款工作由在线客服排队登记办理中。此

06-02 15:56:27

V观财报|中水渔业并购重组遭问询:是否同业竞争? 微动态

报告书显示,本次交易采用资产基础法和收益法对拟收购资产中渔环球、农发远洋、舟渔制品进行了评估。报告书

06-02 15:20:54

我市10万余台农业机械备战“三夏” 天天播资讯

我市10万余台农业机械备战“三夏”本报讯(记者闫丽静)小麦收获日益临近。记者从市农业农村局获悉,全...

06-02 15:07:31

6.18折!罗永浩卖的杭州房子为什么那么便宜?

“6 18折抢一栋大房子,直接在原价基础上砍掉了100来万……”618大促夜,你看罗永浩的直播了吗?继在淘...

06-02 13:36:13

中资离岸债每日总结(6.1) | 银川通联资本、昆山国创投资集团发行

JOLTS的数据显示,美联储密切关注的失业人数和空缺职位比例在四月份上升到1 8,为三个月来的最高水平。商务

06-02 12:57:41

苏州科技大学石湖校区地址 苏州科技大学石湖校区

1、苏州科技大学石湖校区地址:高新区科锐路1号苏州科技大学石湖校区-体育馆地址:苏州市虎丘区。相信通过

06-02 11:36:28

618换购85英寸大电视之后:后悔或者满足?

前段时间家里的电视莫名其妙坏了,因为当初买的时候没太多钱,修的话属实有点不划算,所以就想着直接换个新

06-02 11:27:08

什么是APP?_什么是APQP-天天视点

1、APQP指产品质量先期策划,产品质量先期策划,质量管理体系的一部分。2、产品质量策划定义成一种用来确定

06-02 10:40:23

关于幼儿园3岁女童死亡 警方介入及幼儿园3岁女童死亡 警方介入详情 今日热闻

音频解说1、昆明一3岁幼童在幼儿园突然发病逝世,让人愤怒的是孩子在生前曾发生两次抽搐,第一次抽搐后幼儿

06-02 09:59:14

春华秋实玉汝于成的意思_春华秋实玉汝于成-当前热闻

1、【基本解释】意为像打磨璞玉一样磨练你,使你成功。2、现多指逆境可以帮助一个人取得成功。本文为大家分

06-02 09:23:50

观焦点:眼影颜色怎么搭配_这些选择技巧要知道
车胎爆了还能开多少米(车胎爆了还能开多久?)-今热点
火线有电还是零线有电_火线零线都有电怎么修-当前速讯
寒假计划的英语作文六年级 寒假计划的英语作文 全球简讯
鸿蒙HarmonyOS 3智慧新体验升级,首批支持华为Mate 50手机等机型
焦点热讯:重庆暴雨倒灌车库 居民用绳救人详细内容
心语佳句丨红盒子的激励:我也要拿军功章!
每日热议!千山暮雪匪我思存txt下载(千山暮雪匪我思存)
家庭自做葡萄酒的方法_家庭自做葡萄酒的方法与步骤-最新快讯
天天要闻:吃抑郁症的药会长胖吗_治抑郁症的药有什么
圣达生物:公司尚未回购股份 当前动态
老城区城管局:开展防涝演练 提升应急能力
29岁女友怀孕!82岁影星阿尔·帕西诺将四度当爸_全球看热讯
【新要闻】漾濞彝族自治县气象台发布森林火险Ⅲ级预警【2023-06-01】
variance_与 variation 的区别
天天快看:ST阳光城:预计连续20个交易日低于1元/股,可能被终止上市
4种方法为华硕主板刷BIOS 华硕主板怎么刷BIOS-全球焦点
真情筑希望,童心向未来——平安普惠广西分公司“六一”儿童节关爱行动
全球速读:谢谢你对我倾其所有的好是什么歌_歌词谢谢你对我倾其所有的好是哪首歌
渭城区2023年5月份重点项目集中开工 最新资讯
腾讯文档上线简历助手,简单四步写出令HR心动的简历_当前关注
河南武陟:开展平安护苗专项治理行动 织密未成年人安全“防护网”
獐子岛(002069):6月1日14时19分触及跌停板
三年三天歌词是什么意思 三年三天歌词 全球报道
曲江区畅通医共体绿色通道 护航群众生命健康 每日热点
12306无法支付的原因是什么(12306无法支付)-焦点精选
世界速读:浙江省养老金调整最新消息 浙江省2022~2023年养老金调整方案细则最新消息(全文)
越秀地产获授2亿港元循环贷款融资 天天时快讯
当前观察:别再往眼球上滴眼药水了!秘诀:瞄准“小口袋” 滴完压一压
今日热议:大东区一环内优质地块,德增街“小津桥花鸟鱼市场”将拆迁?
面向企业用户,钉钉斜杠/功能启动邀请测试 时快讯
5月31日基金净值:兴全合润混合(LOF)最新净值1.5495,涨0.43%
今日最新!南方航空推A+H定增计划用于引进50架空客飞机
清明诗句加配图简单版画画_清明诗句
热文:综合消息:“茶和天下·雅集”活动继续在一些国家举行
环球视讯!合肥45中本部在哪里_合肥45中本部在哪
午评:A股三大指数早盘翻红后回落 国防军工板块领涨 天天头条
基于Android TV的智能电视可以在手机的背景下播放音乐
世界关注:补时遭绝平 点球大战憾负 青岛红狮止步足协杯次轮
智能硬件嵌入的AI批改已经到了天花板?实测小猿学练机
不要再拍富豪的故事了,打工人不感兴趣_环球聚看点
婚姻登记“跨省通办”需选择经常居住地,可提前预约
每一脚射门,每一条轨迹构成一个写进历史的全新赛季... 全球即时看
推倒欧洲经济的“多米诺骨牌”|当前速读
新华文轩(601811)5月31日主力资金净买入1545.74万元
焦点要闻:科大国创(300520):该股换手率大于8%(05-31)
焦点信息:杜淳袁姗姗首三天播放量破3亿,成为电视剧市场新圣地!
煤棚降尘喷雾-设施-价格
我找到了阅读GitHub项目源码的最佳姿势,太舒服了!
日联科技(688531):X射线源国产替代不断深化 检测设备多点布局助力高增
x 广告
x 广告

Copyright ©  2015-2022 纤维头条网版权所有  备案号:沪ICP备2022005074号-20   联系邮箱:58 55 97 3@qq.com