解剖屎山,寻觅黄金之第二弹
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。aust
2023-05-22大家好,我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-05-22电力板块异动拉升,桂东电力(600310)涨超7%,通宝能源(600780)、浙能电力(600023)、建投能源(000
2023-05-22“宁我负人,毋人负我”,据说这句话出自曹操之口,但并无实据。不守这句话能嫁祸在曹操身上也是有原因...
2023-05-22北京时间4月27日淄博疫情最新消息-淄博截至4月27日05时30分疫情数据1、现存确诊:0较昨日新增待公布2、累计确
2023-05-22自2022年1月以来,歌尔股份(002241 SZ)的总市值由1953亿元降至目前的631亿元,仅一年半时间,市值跌去近
2023-05-22他提到,气候变化是全球性问题,不分国界。例如,有的可以通过减少碳排放,或者是增加适应能力和恢复能力,
2023-05-222,国米目前掉到第四位,他们只领先AC米兰2分,米兰双雄谁能进入前四,还有很大的变数,这2大豪门,随时仅
2023-05-22今天(5月21日)下午,2023苏迪曼杯决赛拉开帷幕,卫冕冠军、东道主中国队对阵韩国队。韩国队曾4次夺得苏迪
2023-05-221、您好,Kerry有几个不同的意思。2、Kerry是一个外国人的姓氏,也是一个地名,源自英国的土著语言盖尔语。
2023-05-225月20日下午,应邀参加第十六届兰卡威国际海事和航空展的空军八一飞行表演队,在马来西亚兰卡威机场进行了
2023-05-21请搜索关注“雕叔谈楼市”微信公众号,加入知识星球提问,有问必答并送赠送购房内部资料;重要信息只在...
2023-05-21美国刚同意西方盟国,向乌克兰提供包括F-16战机在内的支援,没想到俄罗斯反击随后就到。来自“今日俄罗...
2023-05-211、这个呢,要看你在哪里认定的,全国的话,第一批是在3月份认定(山东和北京),大概4月底5月初就发,第二
2023-05-21工伤认定的费用应该是由用人单位来承担的,若是用人单位尚未给员工购买工伤保险的,则由单位全部负担,若是
2023-05-212023苏迪曼杯决赛,中国队选手石宇奇在第二盘男单对决中,以2∶0战胜韩国队选手李宥奎,为中国队再下一城。
2023-05-21有的微信背景是黑色的是因为把背景设置成了黑色模式。恢复的方法如下:1、点击微信进入后,点击“我。2、...
2023-05-21近日,聊城市“扫黄打非”办公室联合市公安局、市教育局、市交通运输局、市文旅局、市邮政管理局印发通...
2023-05-211、投诉淮安清浦小学6年级周末试卷太简单周末试卷简单的要死,重复劳动,没有任何难度系数,1+1=2和他们比
2023-05-21把握正确舆论导向,关注百姓生活,侧重报道社会生活中的知识性、趣味性、服务性新闻;突出新闻性、可读性、
2023-05-21今天来聊聊关于钢筋价格一览表钢材价格,钢筋价格一览表的文章,现在就为大家来简单介绍下钢筋价格一览表钢
2023-05-21夏日生活打卡季 你和我关系再好,也不能成为“我们”。作者:洞见·李思圆《圆桌派》里,梁文道曾讲...
2023-05-21毗邻地区携手展示丰硕成果本届西洽会专门设置了“成渝地区双城经济圈建设”展馆,重庆部分区县、四川部...
2023-05-211、第一,如果你戴的耳环是耳钩,你需要用一只手轻轻握住耳环,慢慢拔出来。最好不要用力拉它们,以防刺激
2023-05-211、去掉龙虾头和黄色的东西,夹住尾部。2、小红椒和干辣椒对半切,姜蒜对半切片。3、锅里放油,烧到八成热
2023-05-215月20日,位于香港九龙城沙浦道的一个电影拍摄现场20日下午发生升降台倒塌事故,事故造成8人受伤。据多家港
2023-05-21她的宝贝儿子Morris迎来了3岁生日,周励淇也是在家中举办了一个小型的生日聚会为其庆祝生日。周励淇在3年前
2023-05-21网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后
2023-05-21“九九黄河”2023山东省体育旅游系列活动暨系列赛事启动仪式日前在山东滨州惠民县孙武不夜城举行。启动...
2023-05-20证券时报券中社讯,安信基金公告称,5月18日起,新任张翼飞为公司副总经理。张翼飞,历任摩根轧机(上海)
2023-05-20你们好,最近小活发现有诸多的小伙伴们对于芒果甜品100种大全,芒果甜品这个问题都颇为感兴趣的,今天小活
2023-05-20本文目录一览:1、这东西我们这里叫鬼子姜或洋姜,哪位大神知道它学名叫么,并请给详细介绍一下。2、鬼子
2023-05-201、藤县隶属于广西壮族自治区梧州市,东接苍梧县、长洲区、龙圩区,南界岑溪市、玉林市容县,西邻贵港市平
2023-05-20中新网5月20日电题:四个国际单位制新词头中文名称在世界计量日发布中新财经记者刘亮5月20日,在第24个世界
2023-05-201、首先,是蜜柚!认准了平和琯溪蜜柚!然后挑的时候看表面,要光滑点的,手摸摸就能感觉到,看起来也比较
2023-05-20央视网消息:5月中旬以来,母亲节、“520”等具有特别纪念意义的日子,也给鲜花消费市场带来了持续高涨的热...
2023-05-20中国报告大厅2023年5月20日烧碱价格最新走势监测显示:萍乡市立信生化高科有限公司报价机构,今日烧碱(工
2023-05-20MSI胜决JDG击败T1晋级决赛,赛后JDG下路选手Ruler接受了外媒采访。尽管Ruler已经拿到了S7的世界冠军好几年
2023-05-202022年11月18日沈阳震撼发布城市宣传片《心向往新沈阳》带你感受沈阳一天的无限活力2023年5月18日沈阳再度
2023-05-20伴随新一轮科技革命和产业变革,创新在发展全局中的重要地位更加凸显。5月18日,天津市依托天津大学和南开
2023-05-2068岁的重庆人周群自退休后,时常与亲朋好友结伴旅游。她的手机里装着地图软件、旅游预订软件及各种生活服务
2023-05-20最近淄博烧烤可谓火成了全国美食界的“顶流”,而淄博烧烤之所以能火,除却好客的本地人让游客们感到热...
2023-05-202023北京国际摩托车展览会于5月19-22日在北京中国国际展览中心(顺义馆)举办,超500个国内外知名品牌参展
2023-05-20本周末,五大联赛继续进行。英超方面,利物浦和曼联争四进入白热化阶段,如果阿森纳本轮不赢,将提前送曼城
2023-05-20奇富科技(原360数科)今日发布的一季报显示,今年1-3月,该公司实现净收入36亿元,净利润为9 3亿元。今年
2023-05-20全国足球领域教育整顿工作动员部署会19日在京举行。国家体育总局党组书记、局长高志丹在会上表示,全国足球
2023-05-201、堆属性比较重要一般出门装为两种一种是4树枝一药罐一吃树这种的好处是补给足便宜可以直接合魔棒还有一种
2023-05-205月16日,运城籍演员张鹏的妻子女儿其乐融融坐在电视前,观看中央电视台一套黄金时间播出的《雪莲花盛开的
2023-05-20“好物分享”只分享自己入手过的产品今天这篇文章绝对会引起很多人的喜欢和共鸣,4天前的一个早晨,我醒...
2023-05-19达里奥写道,他不认为拜登政府和国会共和党人之间关于提高债务上限的斗争会导致违约,或者如果发生这种情况
2023-05-191、一套公寓是一平方米。如果是一平,那么一平就是3 30378平米或者3 30579平米。2、一平方米代表面积的单位,一
2023-05-192023年5月18日,第十一届茅盾文学奖评奖办公室对外发布公告。公告中写道:“第十一届茅盾文学奖参评作品征
2023-05-19美的554升对开门的一级双变频冰箱官网价3599元,券后降至2199元,补贴力度达到39%;TCL大2匹新一级能效变频
2023-05-19在这两套穿搭中,黑白色彩的简约以光滑的皮革面料,增加了光泽质感的更多纹理时尚,纯色的简约中,结合了
2023-05-19电商报快讯:5月19日消息,京东物流发布公告,根据采纳于2021年5月10日的首次公开发售后股份奖励计划,于20
2023-05-19为更好落实新课标理念,提升英语教师专业素养,共享教学经验与学习收获。2023年5月16日,由天府新区教育科
2023-05-19远古发现丨福建上杭首次发现恐龙蛋化石---福建省地质调查研究院科研团队近期在福建省龙岩市上杭县临城镇黄
2023-05-191、孙楠爱玩,但几乎都与前妻买红妹无关,不是到全国各地乃至国外旅游,就是打高尔夫或者和明星足球队的朋
2023-05-191、老虎是国家一级保护动物。2、虎(学名:Pantheratigris;英文名:Tiger):大型猫科动物;毛色浅
2023-05-19华声在线5月18日讯(全媒体记者曾冠霖顾荣实习生宋科铖)以“5·18国际博物馆日”为主题,今晚在美丽星城...
2023-05-19这次,速度与激情系列真的要迎来大结局了,不仅该出现的角色全员回归,反派也实实在在做到了系列最强。一、
2023-05-19新华社北京5月18日电题:美国是胁迫外交的“集大成者”新华社记者美国一些政客最擅长于对他国贴各种标签...
2023-05-19今天的企业管理者,正承受着前所未有的压力,上层老板希望自己执行到位,下级员工希望自己指挥得当,同级别
2023-05-19欧元 美元:跌幅扩大,空间至1 0760,支撑位为1 0713突破1 0800的水平进一步扩大了4月1 1095高点的跌幅,并
2023-05-195月17日,在世界电信和信息社会日之际,由深圳市通信管理局主办、深圳市通信与互联网协会承办的第五届信
2023-05-19造梦西游3水下迷宫怎么进呢?现在就教给大家方法。造梦西游3水下迷宫怎么进(走)1 来到造梦西游3的天庭地
2023-05-19国网甘肃省电力公司董事、党委副书记王海涛17日表示,2022年该公司强劲电力引擎服务甘肃经济社会高质量发展
2023-05-19美媒:七国集团将同意共同追踪俄罗斯钻石,但不会实施全面禁令:彭博5月18日消息,据知情人士说法和彭博看
2023-05-19晋江罗山街道后林社区:机场边“长出”大公园
2023-05-19再快些、再精准些!作者:牡丹编辑:李鹏风品:刘峻来源:铑财——铑财研究院左手鲜奶、右手烘焙,手握...
2023-05-19元件企业前十名_2023年5月18日企业市值排行榜,《南方财富网趋势选股系统》股票工具数据整理,截至2023年5月
2023-05-195月18日,万盛股份(603010)融资买入117 66万元,融资偿还149 06万元,融资净卖出31 4万元,融资余额7578 57万元。
2023-05-19尽管我国已建成世界上数量最多、辐射面积最大、服务车辆最全的充电基础设施体系,但是与城市相比,广袤的乡
2023-05-19欢迎观看本篇文章,小柴来为大家解答以上问题。达芬奇是哪个国家的,达芬奇介绍很多人还不知道,现在让我们
2023-05-19中国江苏网讯想象一下,一片风电叶片能有多长?5月18日,记者在全国首个风电专用港口——如东小洋口风电...
2023-05-191、低糖的食物有很多,主要有:荞麦、燕麦(两种麦类均可降血压、降血脂、降血糖)、小米、薯类。2、苦瓜、冬
2023-05-191、首先要保证你的光球+的很多。2、强制的都出了才可以XX+天击+光球+落花+火球+流行+球。3、有个BT连法不知
2023-05-19黄金连续做空,黄金周二美盘到现在已经九连胜,前面做空也多是获利,黄金九连胜后美盘初请失业金人数利空直
2023-05-191、电脑的普及给我们的生活和工作带来了许多变化。我们很多人几乎每天都要花费大量的时间在电脑、游戏、娱
2023-05-18同花顺财经讯贵州银行(06199 HK)5月18日发布公告,公司将于2023年7月13日一般分红每股0 067132港元,除净
2023-05-185月18日是世界博物馆日。这个五月,COSMO带你逛逛亚洲这几间最吸“年轻粉”的博物馆~当艺术与科学相遇...
2023-05-18【昆仑万维方汉:大模型领域创业者要试错“独特思考快速失败”】方汉认为,生成式AI的瓶颈在于数据层面...
2023-05-18我国的财政收入主要来自于税收,2023年前4个月,全国税收收入同比增长12 9%。数据显示,1月—4月累计,全国
2023-05-18近日某国产CPU大厂召开发布会,正式推出国产CPU处理器,基于x86架构,该芯片厂在服务器、半导体领域超过26
2023-05-181、我们的祖国是世界文明的发源地之一,有着五千年的文明史,与古埃及、古巴比伦、古印度并称为“四大文...
2023-05-18武汉都市田园综合体LOGO标识发布---5月18日,武汉都市田园综合体创建工作领导小组办公室(市创建办)发布武
2023-05-18股份行个贷业务转型:自营消费贷和个人经营贷2022年被“拉壮丁”,个贷,贷款,股份行,平安银行,渤海银行,...
2023-05-18滇地宝藏,灿若星辰,独树一帜,在“5·18国际博物馆日”到来之际,我们以色彩为线,串起云南省博物馆里...
2023-05-18央视网消息(记者王莉莉)5月18日,山西博物院,距离9点开馆还有一段时间,但入口处已有几十位游客在排队等待
2023-05-18原标题:夜市不“野”,才会更靓杭州萧山有个号称100元吃到饱、人气火爆的野生夜市,在各个社交媒体上被...
2023-05-18截至2023年5月18日收盘,姚记科技(002605)报收于30 99元,上涨4 31%,换手率5 08%,成交量16 71万手,成交额5 15亿元。
2023-05-185月18日上午,区委副书记、区长李泽龙主持召开第31次区政府常务会议,研究亭林镇东新村“城中村”改造项...
2023-05-18为深入学习贯彻党的二十大精神,进一步加深党员干部和群众对党的二十大精神的全面认识和深刻理解,临河镇扎
2023-05-18陈坤儿子的生母竟是她?知三当三道德败坏,如今现状如何?,陈坤,赵子琪,娱乐圈,钟小艾
2023-05-18经财政部注册会计师考试委员会批准,2023年注册会计师全国统一考试报名时间和考试时间如下。一、报名时间网
2023-05-181、武汉乐滋滋保洁服务有限公司于2014年08月13日成立。2、法定代表人陶小翠,公司经营范围包括:保洁服务;
2023-05-18综合外媒报道,哥伦比亚一架小型飞机两周多前坠毁,造成多人下落不明。当地时间5月17日,哥伦比亚总统佩特
2023-05-18据媒体报道,特斯拉公司已向监管部门申请扩建上海工厂,年产能将从目前的125万台提高到175万台。同时,该公
2023-05-18抄写作文网小编为大家提供五首古诗有哪些给我五首古诗(简单点)来供大家参考,欢迎阅读。古诗三百首五字诗有
2023-05-181、在40~50摄氏度的温水中浸泡200~300ml后,可用于改善便秘等症状。2、此外,柠檬片也可直接加入40摄氏度
2023-05-18据央视,当地时间5月17日,美国总统拜登发布讲话称,美国政府明白,美国债务违约将对美国经济和美国人民产
2023-05-18Copyright © 2015-2022 北冰洋水产网版权所有 备案号:沪ICP备2020036824号-3 联系邮箱:562 66 29@qq.com