大家好,我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服务
标签:
解剖屎山,寻觅黄金之第二弹 大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我
热议:刘涛真实生活现状_刘涛真实年龄 刘涛79年出生,今年42岁,刘涛曾当过兵。演还珠格格而红。本文到此结束
四川多地持续高温日数超20天 今年夏天会比去年还热吗? 其中广元、绵阳、德阳、成都、雅安、乐山、眉山高温日数为8—15天,南
重庆美仑美奂医院隆鼻怎么样 看医生实力就知道 重庆美容整形医院是当地的知名品牌,在整形上具有一定的特色和实力,能
100亿元!重庆设立食品及农产品加工产业生态基金-每日头条 6月15日,重庆日报记者从重庆市食品及农产品加工高质量发展产业生态大
市人大常委会开展全市职业教育发展情况专项调查 环球新资讯 枝江融媒(记者刘颖杰)6月15日,市人大常委会副主任郑艳平带队开展全
喜迎亚运,萧山新南郡社区这家便民服务中心火出了圈 亚运的脚步越来越临近,杭州这座美丽的城市正如火如潮的进行各项准备工作,全杭州的居民也做好了准备迎接远道而来的客人,这已经成为每一位
即时焦点:液冷概念股震荡走高,飞龙股份拉升封板 液冷概念股震荡走高,飞龙股份拉升封板,欧陆通大涨8%,高澜股份、依米
【环球速看料】欧兰宁价格_欧兰宁 1、不要老和没得过该病的正常人来比较,奥氮平的不良反应在精神类药品
世界报道:众明星春季私服穿搭谁更好看?李沁超甜,赵露思很韩范,杨紫可爱 天空中阳光灿烂,花儿在对我微笑。春天来了,又到了和春小姐一起出去玩
“游戏+”能否打开科普新世界? 文汇报记者宣晶玩游戏,竟还能参与大熊猫保护。昨天,乐元素携《开心消
交易金额是什么意思?交易金额与交易份额的区别? 交易金额指的就是个人使用不同的支付方法与另一方进行交易时具体的
原腾讯QQ空间负责人,T13专家,黄希彤被爆近期被裁员,裁员原因令人唏嘘。。 世界聚看点 点击上方“码农突围”,马上关注这里是码农充电第一站,回复“666”,
当前关注:明起,连续三天,这些人可免费乘坐西安地铁! 中考期间考生及陪同人员可免费搭乘西安地铁2023年西安市中考将于6月17
焦点播报:2023年贵州高考成绩时间公布 6月几号几点出分 2023年贵州高考成绩公布时间预计在6月下旬。考生可以登录贵州教育考试
宜宾VS常州:动力电池双城记:新能源汽车崛起记-环球头条 四川宜宾和江苏常州,一个地处长江头,一个居于长江尾,千年长江文化浸
每日热门:金昌:金水湖景区天光云影共徘徊 我市全面推进污染防治各项工作,让群众尽享蓝天碧水的生态建设成果。图
快资讯丨海珠区东方红印刷厂地块规划调整公示,拟变身住宅用地 6月16日,海珠区东方红印刷厂地块控制性详细规划修改在市规划和自然资
算力概念午后持续发力,这些公司获机构密集调研 截至发稿,云赛智联、利通电子、美利云涨停,浪潮信息涨超9%,城地香江
全球实时:凤凰花开,跨海相会!海峡论坛奏响两岸融合发展最强音 “凤凰花又开,鹭岛再相聚”。作为两岸的品牌活动,第十五届海峡论坛将
云仓酒庄经销商分享精酿啤酒和普通啤酒的区别|今日聚焦 人到中年的父亲,劳累了一天会喜欢买一瓶普通的啤酒消解一天的疲惫与乏
全球今日讯!德意志银行、富达国际收购万达债券 已增持2.63亿美元 有分析师称,万达基本面强劲,可能出现逢低买入一些世界上最大的基金经
国家统计局:二季度经济增长明显快于一季度 环球热推荐 国家统计局新闻发言人付凌晖6月15日表示,从目前情况看,由于去年基数
畜牧养殖贷款申请需要担保人吗?畜牧养殖贷款额度是多少? 畜牧养殖贷款申请需要担保人吗?畜牧养殖贷款额度是多少?以下是小编
巨湾技研XFC极速充电电池基地落户重庆 总投资72亿元 6月15日,江津区与广州巨湾技研有限公司(以下简称巨湾技研)举行签约
环球信息:智立方(301312):该股换手率大于8%(06-16) 摘要:2023年06月16日智立方(301312)换手率大于8%,主力资金净流出27
葡萄种子发的芽是什么样的-天天讯息 关于葡萄种子发的芽是什么样的的内容,包含葡萄种子怎么发芽葡萄种子怎
重点聚焦!比亚迪海豹对手来了!荣威纯电轿车D7官图发布 比亚迪海豹对手来了!荣威纯电轿车D7官图发布2023年6月16日,荣威旗下
世界速看:上海贝岭:公司ADC/DAC产品已在工业控制、医疗成像、电网保护装置等领域... 上海贝岭:公司ADC DAC产品已在工业控制、医疗成像、电网保护装置等领
一体机玩游戏体验好吗?一体机和游戏本哪个更好用?|天天新要闻 一体机玩游戏体验好吗?为了节省空间,一体机牺牲了很多性能。因为空
2023住小帮设计师大赛城市巡讲·青岛站圆满收官,助力新锐设计IP打造 当今时代,室内设计不再只是一种艺术表现形式,更代表着一种生活态度。6月13日,由住小帮主办、立邦总冠名、COLMO首席特约合作的2023住小帮
2023深圳深汕特别合作区招聘网格员笔试内容 世界消息 2023深圳深汕特别合作区招聘网格员笔试内容对通过资格初审的报考人员组
怎么把DVD盘格式化?dvd盘读不出来怎么办? 如何格式化:1、打开电脑的光驱,把准备格式化的光盘插入电脑的光驱
石斛鲜条怎么吃较好(三种人坚决不能吃铁皮石斛) 石斛鲜条的营养与功效石斛鲜条是一种特殊的中药材,具有许多营养和功效
信用卡八万逾期多久会被起诉?信用卡逾期八万要判多少?|天天关注 信用卡八万逾期多久会被起诉?信用卡逾期八万一般三个月以上就可能会
全球今热点:警惕上市公司蹭热点被反噬 原标题:警惕上市公司蹭热点被反噬今年以来,A股市场热点频生,AIGC、C
大四女生退租,留下满屋垃圾跑了,房东崩溃:没有保洁愿意打扫_世界关注 大四女生退租,留下满屋垃圾跑了,房东崩溃:没有保洁愿意打扫,哈尔滨
6月16日国内丁苯橡胶市场行情小幅波动_焦点简讯 6月16日国内丁苯橡胶市场行情小幅波动。乳聚丁苯橡胶出厂价暂稳,下游
抖音怎么看别人浏览我的记录(抖音怎么看别人浏览我的记录次数) 演示品牌型号:华为p40pro,iPhone12,小米11;系统:emui11,ios14,M
天天实时:2023年吸尘器概念相关的上市公司一览(6月16日) 2023年吸尘器概念相关的上市公司一览(6月16日),2023年吸尘器概念相关
今年618最值得买的口袋云台相机——飞宇Pocket 3,错过再等一年! 专业相机稳定器拍摄效果必然出片,但对于喜欢户外运动或是旅行出游的小伙伴来说,相机稳定器框架较大,设备繁重多有不便,这个夏天,你需要
今天,这个项目又两大配套落地 即时看 双喜农庄菌子宴盛大开业、小象会飞酒店试营业
中金:维持阅文集团(00772)“跑赢行业”评级 目标价52港元-天天日报 智通财经获悉,中金发布研究报告称,维持阅文集团(00772)“跑赢行业”
一夜3队阵容动态!马刺确选文班,雄鹿挽留二将,快船给威少画饼|世界看点 黄蜂拥有今年的榜眼签,探花签则是在开拓者手中,火箭和活塞分别是第4
网友反馈 12VHPWR 接口导致电源侧出现熔化情况
IT之家6月16日消息,12VHPWR接口的熔化问题已多次曝光,不过此前主要发
喜迎亚运,萧山新南郡社区这家便民服务中心火出了圈 亚运的脚步越来越临近,杭州这座美...
南充市顺庆法院潆溪法庭:一站式综合解纷平台 护航辖区发展|全球热推荐 “没想到案件审判完了就能立即拿回...
81秒进球创纪录 梅西闪耀新工体 时针指向6月15日23时,距离阿根廷...
地电离石分公司开展安全日咨询活动 全球微速讯 黄河新闻网吕梁讯6月16日,地电离...
当前热文:昱能科技(688348):该股换手率大于8%(06-16) 摘要:2023年06月16日昱能科技(68...
港元拆息连续三日全线上升 与楼按相关的一个月拆息逼近5%创近半年新高 6月16日,美国暂停加息不阻港元拆...
世界热议:民警巧用APP 揭穿无证司机 近日,一无证司机在接受吉林高速公...
41星轨道怎么算?“牧星人”有高招! 2023年6月15日13时30分,我国使用...
南充市顺庆法院潆溪法庭:一站式综合解纷平台 护航辖区发展|全球热推荐 “没想到案件审判完了就能立即拿回...
梅西无敌过人!阿根廷跟队:怎么做到的!?享受他的每一场比赛 焦点快报 阿根廷vs澳大利亚第78分钟,梅西中...
中国主会场 | “大汉紫道”将有啥体验? 全球新消息 中国主会场|“大汉紫道”将有啥体验?
黔南州积极探索人民调解新机制推进信访矛盾纠纷化解 法治日报全媒体记者王家梁王鹤霖通...
79年羊2022年运势如何,2022 79年羊2022年运势如何女-天天快播报 综合运势 属羊天蝎座在虎年里会...
看点:越南惊现停电潮,富士康、三星等大厂慌了 时隔7年,再次给越南供电
滴漏咖啡冲泡方法视频_滴漏咖啡怎么冲 1、滴咖啡最早是法国人发明的,现...
床上用品四件套怎么选好_床上用品四件套怎么选 不要看被罩和枕套,双层的很难看出...
全球热讯:乙类乙管后首个暑运旺季,民航局预计火过疫情前的2019年 “今年暑运是”乙类乙管“后的第一...
西部矿业:去年的团结湖提锂试验属于实验室探索试验,尚未进入中试阶段 全球快看 每经AI快讯,有投资者在投资者互动...
预估2023江西一本分数线 录取分数预计多 一般来说可以通过往年的一本录取分...
解剖屎山,寻觅黄金之第二弹 大家好,我3y啊。由于去重逻辑重构...
纯碱多头趋势初现,持续性有待观察 今日讯 嘿,大家好!我们来聊聊纯碱的走势...
世界今日报丨南投县长许淑华办客家文化节 盼族群融合 中国国民党南投县长许淑华今天宣布...
广东省总工会、省乡村振兴局联合发文:加大力度持续开展消费帮扶集中行动 南方网讯(记者 邓佩莹通讯员 王...
爆款《羊了个羊》被质疑不算游戏?制作人回应:不算游戏更好-环球聚焦 “火爆中遇到的最大问题就是技术问...
开场81秒破门 梅西助阿根廷队取胜 环球要闻 原标题:开场81秒破门(引题)梅西...
美媒:“原子旅游”在美流行,冷战核设施成热门打卡地|世界实时 据美国《华尔街日报》近日报道,受...
过年的风俗有什么寓意,过年的风俗及寓意 全球快讯 春节,俗称春节,是我国非常隆重、...
海水咸鱼干的做法? 每日关注 食材鱼适量盐适量方法 步骤1、原...
生意社:市场竞争激烈 近期华东地区水泥价格弱势下跌_当前观察 智通财经APP获悉,6月16日,据生意...
盈通 RX 6600 显卡降至 1399 元:8GB 显存,主打 1080p 游戏
|热点 IT之家6月16日消息,本月初京东618...
【世界时快讯】1年380万!家乡折扣价!威少该不该留在快船? 需要说的是,在没有做任何交易而且...
当前聚焦:美国多个政府机构遭黑客攻击,俄相关组织声称对攻击负责 据路透社15日报道,美国官员当天表...
“优质服务,真诚守信”—平安财险南通中支获客户锦旗 近日,于女士来到平安产险南通中支...
全球微资讯!eox锅具牌子怎么样_eox 1、EOS-是指“ElectroOpticalSyste...
古历查询_古历 1、古历和农历意思是不一样的。2、...
新罗西斯克_关于新罗西斯克简介 1、新罗西斯克(俄语:Новоро...
当前快播:端午节前夕勖勉海军 蔡英文:不会挑起争端 端午节将届,蔡英文今天前往高雄勖...
信用卡八万逾期多久会被起诉?信用卡逾期八万要判多少?|天天关注_百事通 信用卡八万逾期多久会被起诉?信用...
诗童家具:秉承工匠精神,提升生活品质_世界热闻 成都诗童家具有限公司创建于2008年...
领克09亚运行政五座版上市 售价28.99万元-每日头条 领克09亚运行政五座版正式上市,售...
华如科技(301302):该股换手率大于8%(06-16) 摘要:2023年06月16日华如科技(30...
嘉益股份(301004):该股换手率大于8%(06-16) 摘要:2023年06月16日嘉益股份(30...
拼多多流量上不去怎么办?如何开车? 如果你在拼多多上经营店铺,但发...
硅宝科技 (300019):6月16日该股突破长期盘整 股价突破长期盘整:前30日在上下30...
世界今日报丨解码5月车市3大特点 作者:大众侃车?张娜排版:橘子洲...
环球快讯:博主称路过云南泸沽湖景区仍需购票 景区回应 有短视频平台博主发视频称走省道经...
天天观察:Anker Soundcore Space Q45评测适合您的耳朵和预算 Anker很好地证明了SoundcoreSpaceQ...
天天即时看!三星Note20Ultra多少钱?详细解读热销旗舰 作为三星2020年推出的主打旗舰,No...
当前热文:昱能科技(688348):该股换手率大于8%(06-16) 摘要:2023年06月16日昱能科技(68...