解剖屎山,寻觅黄金之第二弹
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。aust
2023-04-12大家好,我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);privatefinalMap serviceHolder=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啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。aust
2023-04-12如不能正常浏览请选用IE浏览器天津北方网讯:作为大学生,看准了高校学生的市场需求,开始了自己的创业。石
2023-04-12父母是最好的礼物,就是给父母最好的礼物。平时父母辛苦了,不舍得为自己花钱,所以一定要给父母一点礼物,
2023-04-12B&OBeoplayEX真无线蓝牙耳机怎么样,效果真实评测【买前必看】
2023-04-12据西昌公安通报,西昌森林火情因违规用火引起,目前涉案人员已被控制。来源:央视新闻客户端流程编辑:TF060
2023-04-12一、2手房交易过户费应该谁交2手房交易过户费应该买卖双方一同承担。具体如下:1 契税:缴纳人:买方;房屋
2023-04-12深圳市教育局关于做好2023年普通高中学校自主招生工作的通知各区(新区)教育行政部门,各有关学校:根据教
2023-04-12证券板块涨0 05%红塔证券涨2 77%居首
2023-04-12做好卫浴产品“保暖”措施
2023-04-122023年4月12日美元拆借加权成交利率上午价格
2023-04-12近日,国家发展改革委负责人强调,支持平台企业大显身手。平台企业要增强信心、大胆探索、持续创新,相...
2023-04-12【最热板块要熄火?AI大牛股提示风险机构资金火速逃离】在AI概念股被炒高后,机构资金已开始获利出逃。...
2023-04-12如果你们关系特别好,可以买一些补品,或者你们两个一起去看他(她的),买一些有营养的东西,如果没有...
2023-04-12本文目录一览:1、刘恺威主演的《国色天香》的结局是什么?2、《国色天香》的大结局是什么?3、爱情悬疑
2023-04-12我国新增人民币贷款10 6万亿元(主题)人民日报海外版北京4月11日电(记者徐佩玉)我国首季金融统计数...
2023-04-12近日,省林业局公布了第一批“浙江省观鸟胜地”名单,杭州萧山雁荡湿地等12家上榜。截至2021年底,浙江...
2023-04-12要知道,滑盖手机容易出现短路现象,翻盖手机不方便在操作,只有直板手机可以帮助人们直接接听电话,故...
2023-04-12我给我姐姐买的是一个几百元的礼物,现在我还是单着:给我姐姐的礼物一个1000元给姐姐,她平时挺爱我的...
2023-04-121、做室外效果图一般用3dsMax和SketchUp用Photoshop做后期处理,若果你只是做室外效果图那
2023-04-12日前,别克E4(ElectraE4)现身工信部第370批《道路机动车辆生产企业及产品公告》新产品公示中,新车采...
2023-04-12仲春时节,草长莺飞。正是人间最美四月天,随着气温一起攀升的还有沉寂了三年的消费浪潮。然而随着全渠...
2023-04-12她是《天龙八部》中的娇俏灵动最终为情而死的阿朱、也是《白蛇传》中修炼千年的蛇妖白素贞、还是《欢乐...
2023-04-12本文目录一览:1、康复的意思2、康复的名词解释3、康复是什么意思康复的意思“早日康复”的意思是希望别
2023-04-11极目新闻记者陈凌燕视频剪辑陈凌燕00:0716日,2023武汉马拉松将正式开跑。为了保障比赛顺利进行,各个环...
2023-04-11一季度上坤地产销售约11亿元,佳源国际销售近13亿元,佳源,上坤地产,地产销售,合同销售面积
2023-04-11格隆汇4月11日丨三人行(605168 SH)发布2022年年度报告,实现营业收入56 53亿元,同比增长58 30%;归...
2023-04-11智通财经讯,清科创业(01945)发布公告,于2023年4月11日斥资2708港元回购股份1200股,每股回购价格为2
2023-04-11纽泰格4月12日公布2022年年度分红预案:以8000 0万股股本为基数,向全体股东每10股派发现金红利1元(含...
2023-04-112023上海车展当日可以买票吗?答:不可以。2023上海车展实行实名制提前购票,门票预售时间为:2023年4月1...
2023-04-11(本网记者周婷实习记者滕建珊)张义琼是贵州亘蓝母图民族布艺蜡染开发有限公司创始人,同时也是一位蜡染...
2023-04-11ChatGPT、Midjourney的爆火,让人工智能创造的内容持续在全球出圈,掀起一场人机互动的热潮。毫无疑问,...
2023-04-11心中有猛虎,细嗅蔷薇”的意思是老虎也会有细嗅蔷薇的时候,用来比喻人忙碌而远大的雄心也会被温柔和美丽...
2023-04-11大家好,小乐来为大家解答以上的问题。岳阳楼记翻译越短越好,岳阳楼记译文100字简略版这个很多人还不知...
2023-04-11为弘扬清廉文化,推动清廉校园建设,近日长沙民政职院艺术学院在2022年清廉学院建设工作基础上,持续推...
2023-04-11最近谷歌可能会在2021年推出自己的可折叠PixelFold这个话题,相信很多小伙伴都是非常有兴趣了解的吧,一...
2023-04-11Canalys给出的统计报告显示,全球PC出货量依然在暴跌,这是没有办法的事情,用户需求减弱,同时显卡等价...
2023-04-11全市检察机关推动普法强基补短板专项行动走深走实
2023-04-11从众人追捧的“小甜甜”到令人无奈的“烫手山芋”,新能源主题基金还在苦等“翻身”,而与新能源产业相...
2023-04-11直播吧4月11日讯马卡电台报道,皇马有意引进楚克乌泽。楚克乌泽是一名23岁的右边锋,他在比利亚雷亚尔击...
2023-04-11归于原材料价格下降等影响浙江永强2023年第一季度归母净利预计3 91亿元–4 53亿元
2023-04-11欢乐家:关于欢乐家食品集团股份有限公司非经营性资金占用及其他关联资金往来的专项说明
2023-04-101、如果是为了适应男孩的个性,建议选学卡祖笛(会哼歌就会吹)、竖笛、口风琴、电子琴、尤克里里、吉他...
2023-04-10前几天,看到一位刚玩玉不久的小兄弟在朋友圈发圈说:这个料子真有意思,估计要值好几万吧。如果是我的...
2023-04-10格隆汇4月10日丨兴发集团600141600141SH公布预计2023年第一季度实现归属于上市公司股东的净利润为43亿元...
2023-04-104月10日晚间6家上市公司发布重大利好消息,6家公司均涉及业绩增长,具体涉及的上市公司如下:1 中兴商...
2023-04-10从曝光信息可以看出,iPhone15ProMax的摄像头凸起部分为3 78毫米,比iPhone14ProMax的版本增加了约5%。相机外圈直
2023-04-10恒大地产新增被执行4亿元目前被执行总金额已超358亿元,广州,总金额,恒大集团,恒大地产集团,房地产开发有限公司
2023-04-10来自SeafoodMedia4月4日消息,截止3月29日,俄罗斯渔船捕捞量137万吨,较2022年同期增加12%,其中,在远...
2023-04-102023年3月,中国移动和留言联合京东快递,为京东快递小哥定制了视频来电秘书,创新推出物流行业智慧通信...
2023-04-101、暨南大学图书馆创建于1927年,现由校本部(石牌校区)、南校区(番禺校区)、珠海校区、华文学院、深...
2023-04-10近日,我区召开交通运输行业防汛备汛工作电视电话会议,认真落实国家和自治区有关要求,全面部署防汛备...
2023-04-10商洛法院走好新时代为民之路
2023-04-10永乐坊,一条92岁的上海老弄堂,从物业职能缺位到如今社区环境优美,邻里和谐相处。居民田维忠说:“如...
2023-04-10田华封面新闻记者刘彦谷“谢谢王叔叔和护士阿姨们,这是我专门画给你们的。”经过9个多月的治疗,近日,...
2023-04-10伊朗对以色列持续不断的袭击行为无法容忍,如今伊朗伊斯兰革命卫队要袭击以色列船只,这一情报当然很具...
2023-04-104月10日,沪深主板迎来首批注册制下10家企业的上市交易,注册制改革在资本市场全面落地。过去四年间,注...
2023-04-10马龙险遭大冷:苦战5局拿下世界第30握拳怒吼摇头不满状态
2023-04-101、就像第一次心动时脱口而出的告白;第一次十指紧扣牵手散步的情话;第一次温柔细语的关心 ...
2023-04-091、目前没发现。2、不好意识啦。本文到此分享完毕,希望对你有所帮助。
2023-04-09科林退:关于向深圳证券交易所提交复核申请的公告
2023-04-09特斯拉储能超级工厂项目正式落沪:特斯拉储能超级工厂项目签约仪式今日在上海正式举行。据了解,特斯拉...
2023-04-09点蓝色字关注“机器学习算法工程师”设为星标,干货直达!自从DALL·E2之后,在图像生成方面扩散模型替...
2023-04-091、笔画0攴攵笔画2收考笔画3攸改攺攻攼笔画4攽放玫笔画5
2023-04-091、把失灵的按键扣下来,里面的像小奶嘴的透明弹簧膜拿掉,清理里面触点。2、再装回去,如果还不好用,...
2023-04-09编者按2023世界研学旅游大会日前在洛阳举办,本届大会会聚政务嘉宾、全球文旅组织代表、研学旅游营地代...
2023-04-09(记者李苑)近日,在第十一届储能国际峰会暨展览会开幕上,多位政府官员和行业专家在会上探讨了储能未...
2023-04-09以下是米奥会展在北京时间3月31日14:05分盘口异动快照:3月31日,米奥会展盘中涨幅达5%,截至14点05分,...
2023-04-09千里运河始于泉龙泉漱玉景重现
2023-04-091、第十一届唐山中国陶瓷博览会将于08年9月26日-30日举行。
2023-04-08直播吧4月8日讯CBA官方宣布,刘泽一当选常规赛最具进步球员:从上赛季的场均19 2分钟贡献6 8分3 9篮...
2023-04-081、藿香正气水--功能与主治:解表祛暑,化湿和中。2、用于外感风寒,内伤湿滞,夏伤暑湿,头痛昏重,脘...
2023-04-08关于征集伍三桥等人违法犯罪线索的通告近日,湖北省公安厅异地调集荆州、监利两地警力在仙桃市开展集中...
2023-04-08一、按揭买的房夫妻离婚如何办按揭买的房夫妻离婚的办法如下:1 如果离婚夫妻事先有约定的,按事先约定...
2023-04-08这个阎王贴,之前唐三在对战时年的时候就用过,瞬间让时年化为灰烬。深海魔鲸王不是一般的魂兽,他的修...
2023-04-08郑州青年驿站开张首周收到申请785人次
2023-04-08雅思是著名的国际性英语标准化水平测试之一。雅思,简称IELTS,中文名为国际英语语言测试系统,是由英国...
2023-04-081、原料2、将电线缠绕在套管上,用钳子夹住,然后切断。3、做5个4厘米、5厘米和6厘米的圆圈。4、穿上丝...
2023-04-08粤传媒于2023年4月8日披露年报,公司2022年实现营业总收入5 46亿元,与上期持平;实现归母净利润4435万...
2023-04-082023年4月7日清水源300437发布公告称公司于2023年4月7日召开业绩说明会具体内容如下问根据贵司回答公司...
2023-04-07板胡独奏香魂女选段送环环自激油身半凑,有没有说明,不想失为瞧不起她的心思。你知道她喜欢什么类型的...
2023-04-07新一轮冷空气将南下!玉林或有短时雷暴大风强对流天气
2023-04-07近日,空中客车公司与中国航空业合作伙伴签署新的合作协议,其中包括160架空中客车民用飞机的批量采购协...
2023-04-07万辰生物(300972)04月07日在投资者关系平台上答复了投资者关心的问题。
2023-04-071、西游记上说,大金鹏鸟的姐姐凤凰吞了如来,又把他吐了出来。2、就相当于把他生出来,所以,说大金鹏...
2023-04-07电科院4月7日公告,按照公司相关规定,前任董事长应将公司印章移交给公司现任董事长宋静波,由宋静波按...
2023-04-07消除老人资金忧虑,他们让失独老人不失爱
2023-04-07为强化校园及周边食品安全监管,保障广大师生“舌尖上的安全”,近日,分宜县市场监管局联合县教体局、...
2023-04-07他是东吴名将,平定山越北抗曹魏屡立战功,却被演义忽视名声不显,说起三国时东吴名将,受到演义的影响东...
2023-04-07“你好,中国”中国旅游推介会在巴黎“圈粉”---由巴黎中国文化中心、中国驻巴黎旅游办事处和远海国际旅...
2023-04-074月4日,河北省政府新闻办召开的“河北省加快建设临港产业强省”新闻发布会透露,日前《河北省加快建设...
2023-04-07日本与韩国科学家发现了一种以前未知的铀同位素——铀-241,其原子序数为92,质量为241,半衰期可能只有...
2023-04-07以下是兰石重装在北京时间4月7日09:53分盘口异动快照:4月7日,兰石重装盘中快速回调,5分钟内跌幅超过2...
2023-04-071、其实都差不多,怀仁的管理制度严格,对学生要求多,逼迫你不得不学习,但是师资力量不是很强,附中的...
2023-04-07百科火为您提供西红柿炒牛肉的做法、西红柿炒牛肉怎么做、西红柿炒牛肉怎么做好吃、西红柿炒牛肉的做法...
2023-04-07今天来聊聊关于一公斤水等于多少升酸,一公斤氢氟酸等于多少升氢氟酸的文章,现在就为大家来简单介绍下一...
2023-04-071、一个修炼灵魂转世的人,来到了一个陌生的符咒世界,从七八岁的小孩开始学习。2、探索秘境,接触更多...
2023-04-07完美世界发布了2022年度报告,全年实现营业收入76 70亿元,实现归母净利润13 77亿元,同比增长273 07...
2023-04-062022年农村70岁养老补贴新消息70岁老人农村养老金多少钱农村70岁养老补贴养老保险参加了新农保的村民60...
2023-04-06基础层企业华江科技(837187)发布2022年年度报告,公司营业收入为5 61亿元,同比增长29 73%;归母净...
2023-04-06《港湾商业观察》王心怡前次递表失效后,宜明昂科生物医药技术(上海)股份有限公司(简称“宜明昂科”...
2023-04-06Copyright © 2015-2032 华西水产网版权所有 备案号:京ICP备2022016840号-35 联系邮箱: 920 891 263@qq.com