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

2023-05-27 21:58:26 来源: 程序员客栈

大家好,我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啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。aust

05-27 21:58:26

孜然牛肉炒香菇怎么做?

香菇200克牛肉150克油适量盐2克糖2克生抽1茶匙蚝油1茶匙生粉1茶匙芝麻油几滴胡椒粉少许大蒜10克青椒20克香

05-27 20:53:32

伊戈尔董秘回复:目前公司新能源产品主要应用在光伏发电领域

伊戈尔(002922)05月27日在投资者关系平台上答复了投资者关心的问题。

05-27 19:20:12

生意祝福语大全四字短句_生意祝福语大全四字

1、偃旗息鼓发音yǎnqíxīgǔ释义偃:仰卧,引伸为倒下。2、放倒旗子,停止敲鼓。3、原指行军时隐蔽行踪,

05-27 19:07:13

什么是tpp和fpp_tpp和fpp有什么区别 环球热议

1、Tpp和fpp是一款游戏的两种不同视角模式。那么它们之间有什么区别呢?2、Tpp模式是第三人称服务器,fpp模

05-27 17:35:57

李易峰出啥事了 pc是什么意思真相让人细思极恐具体情况详细内容介绍

想必大家现在对于李易峰出啥事了pc是什么意思真相让人细思极恐方面的消息都是比较想了解的吧,那么针对于李

05-27 16:34:10

每日简讯:异常!平安基金宣布:暂停!

一起上市公司推迟分红派息的事件,或间接扰动了ETF市场。5月26日,平安基金公司公告,旗下沪深300ETF因申购

05-27 15:31:02

当前热门:罗马狂欢节_关于罗马狂欢节介绍

1、他还作有《雷鸣电闪波尔卡》等一百二十多首源自捷克的波尔卡舞曲及几十首其他舞曲。

05-27 15:01:28

天天热头条丨伦铜周五收涨超2%

LME期铜收涨172美元,涨幅2 16%,报8135美元 吨。LME期铝收涨6美元,报2238美元 吨。LME期锌收涨72美元,报

05-27 14:11:24

中上协宋志平:提升“关键少数”规范意识和履职能力

证券时报网讯,5月27日,在中国上市公司协会年会暨2023中国上市公司峰会上,中国上市公司协会会长宋志平表

05-27 12:09:57

每日快看:微信支付密码怎么找回(微信支付密码忘记了怎么找回)

1、忘记微信支付密码如何找回IOS、Android系统:请登录微信。2、“我”=》钱包=》点击右上角的三个点=》支

05-27 11:32:05

梦幻联赛S20公布直邀队伍 中国Aster和LGD入选

梦幻联赛S20的参赛队伍已经基本确认,中国Aster和LGD入选。16支顶尖战队将飞往欧洲争夺高达100万美金的总奖

05-27 11:15:23

天天热头条丨短歌行原文及翻译全文 短歌行原文及翻译赏析

今天来聊聊歌行原文及翻译全文,短歌行原文及翻译赏析的文章,现在就为大家来简单介绍下短歌行原文及翻译全

05-27 10:20:53

西部矿业:5月26日融资买入2154.33万元,融资融券余额14.22亿元_全球速看

5月26日,西部矿业(601168)融资买入2154 33万元,融资偿还1876 42万元,融资净买入277 91万元,融资余额14 01亿元。

05-27 09:26:56

年内第八次释放松绑信号 南京出台多项公积金新政

转自:证券日报5月26日,南京住房公积金管理中心官方公众号发布《关于调整部分住房公积金政策的通知》,出

05-27 08:06:46

Broe Group聘请工业房地产领导者领导新的铁路服务房地产平台_天天热消息

市值数十亿美元的私有房地产、交通、能源和投资组织BroeGroup已任命ChrisTecu为工业发展高级副总裁。通过其

05-27 06:58:47

全球热推荐:榜妹热线 | 王俊凯也去街舞了?宋威龙刘浩存二搭?鞠婧祎没资源?李宏毅终于进组?毕雯珺新剧?

‍‍答:鞠婧祎这大半年确实没有舞台跟综艺的安排,自从进组到《花间令》后露面就更少了,最近出的《今日晴

05-27 06:21:07

最新快讯!体面高音质mp3下载(体面mp3下载微盘)

来为大家解答以下的问题,面高音质mp3下载,体面mp3下载微盘这个很多人还不知道,现在让我们一起来看看吧!1

05-27 04:26:29

a number of与the number of的用法区别(a number of 和the number of 的区别和用法) 天天通讯

1、anumberof与thenumberof,二者的区别涉及到主谓一致的问题,它们修饰名词作主语时,谓语的数是

05-27 03:21:11

市城市照明管理处安全大排查 保照明设施安全度汛

根据天气预报,市城市照明管理处提前行动,于5月22日开始对照明设施进行安全隐患大排查,确保汛期安全。全

05-27 02:30:15

焦点快看:2023苏州端午节狮子林需不需要预约?怎么预约?

2023苏州端午节狮子林需不需要预约?怎么预约?景点购票入口:点击购买门票价格旺季门票:40元 人次(4月、5

05-27 01:37:36

本周盘点(5.22-5.26):江龙船艇周跌5.41%,主力资金合计净流出5662.03万元

截至2023年5月26日收盘,江龙船艇(300589)报收于14 51元,较上周的15 34元下跌5 41%。本周,江龙船艇5月2

05-27 00:32:22

2023中关村论坛|北京国际科技创新中心建设如何?五个“北京经验”公布

5月26日,在2023年中关村论坛上召开的全球工程创新论坛上,《北京国际科技创新中心建设情况评估报告》(以

05-27 00:18:28

面对新增领域的案件,仙霞新村街道综合行政执法队这样执法……_当前要闻

行政执法事项划转城管执法部门,对街镇综合行政执法队而言,需直面的是执法范围逐渐拓宽、办案难度显著增加

05-26 23:21:48

“节约粮食 光盘行动”节粮大讲堂暨主题探访活动点燃京城夏日 天天视点

原标题:“节约粮食光盘行动”节粮大讲堂暨主题探访活动点燃京城夏日近年来,社会各界竭智尽力深入推进...

05-26 22:12:32

他为何要对着列车敬礼?

一位网友乘坐火车去西藏旅游,意外用镜头记录下车窗外的震撼一幕:目光所及之处一片白茫茫,冰天雪地里

05-26 21:12:27

环球今亮点!车联网提升/驾乘更舒适便捷 试驾全新捷达VS7高光版

经过四年的积累和沉淀,在如今竞争激烈的国内汽车市场上,说起捷达,大家对它的印象已然从一个经典车型进化

05-26 20:58:07

南湾猴岛上新!沉浸式球幕穹顶天幕秀体验馆开工建设 环球快看

南湾猴岛生态旅游区品牌运营副总监邢福海介绍,届时,市民游客在沉浸式球幕穹顶天幕秀体验馆内,可通过可视

05-26 20:32:44

旅游市场如火如荼 从财报看一季度旅企“火候”如何?

5月24日,同程旅行控股有限公司(同程旅行,00780 HK)发布截至2023年3月31日止三个月的第一季度业绩报告。

05-26 19:55:17

中国将重点在四方面推进与中亚国家经贸合作

据新华社北京5月25日电(记者谢希瑶)商务部新闻发言人束珏婷25日说,首届中国—中亚峰会达成了一系列重要

05-26 18:35:48

焦点观察:血糖飙升?试试这些茶叶帮助你掌控血糖

引用:先锋鸟是一个慢性病管理APP,可以帮助你记录血糖、血压、尿酸、饮食和运动等信息,还有无糖食品免费

05-26 18:40:31

法尔克:拜仁目前对弗拉霍维奇不感兴趣

直播吧5月22日讯法尔克消息,拜仁无意引进弗拉霍维奇。法尔克表示,拜仁仍然对于弗拉霍维奇不感兴趣,目前

05-26 18:18:36

环球最新:盘后3股公布分红方案-更新中

【15:46鸿荣重工公布2022年年度分红实施方案(每10股送红股4股)】鸿荣重工(股票代码:872971)公布2022年年

05-26 16:46:26

消防员灭火后从角落救出一窝小奶猫

消防员架设水枪将火扑灭,在清理火场时,听到有微弱的猫叫声,蓝朋友立即在浓烟中仔细搜寻,救出一窝小奶猫

05-26 15:55:54

六国化工召开前4个月经济运行分析会 世界观天下

5月20日,六国化工公司召开今年前4个月经济运行分析会,所属各单位、相关部门作工作汇报,该公司领导班子成

05-26 15:13:50

天天讯息:宁夏出台办法支持企业建设飞地研发中心

宁夏日报消息,近日,从自治区科技厅获悉,为加快东西部科技合作引领区建设,自治区科技厅、党委人才办、人

05-26 14:37:54

达州市加强基层党风廉政建设片区现场推进会召开

达州市加强基层党风廉政建设片区现场推进会召开

05-26 13:56:34

工行淮安洪泽支行积极推动“换卡不换号”服务工作|环球微动态

淮安洪泽支行将换卡不换号服务作为一项常态化工作,不仅让员工做到对操作流程了如指掌,以便更好的利用厅堂

05-26 12:37:02

05月25日新房成交590套;涨价房源329套

根据武汉市住房保障和房屋管理局数据显示,2023年05月25日武汉新建商品房成交590套,较昨日增加21套,环比

05-26 12:01:34

【聚看点】演绎老北京一家人的喜怒哀乐,京味话剧《家宴》亮相通州

近日,作为“通州区公共文化服务优秀剧目惠民演出”剧目,亲情题材京味话剧《家宴》在通州区文化馆剧场...

05-26 11:28:52

每日关注!京粮控股:融资净偿还55.06万元,融资余额1.54亿元(05-25)

2023年5月25日京粮控股融资净偿还55 06万元,融资余额1 54亿元

05-26 10:39:28

韩自研火箭技术故障 发射取消 资讯

据大公报报导,据法新社报导:韩国自主研制的“世界号”运载火箭在发射前几小时出现技术问题,发射计划...

05-26 10:01:26

世界聚焦:武汉最高墙画竟然就在这里

武汉最高墙画竟然就在这里

05-26 09:14:52

被雷劈死的人是坏人吗(被雷劈死的人)

导读1、我是甘肃人,在我们老家的说法是人死了没有埋葬之前打雷闪电都是很不好的,会把鬼魂吓跑,不呆在灵

05-26 08:13:48

快讯:无花果酱的家常做法(制作无花果酱需要把洗净切好的)

制作无花果酱需要把洗净切好的无花果和所有材料一起放入碗中搅拌均匀,放置30~60分钟后,再倒入锅中小火煮

05-26 07:28:59

sa是什么意思的_sa是什么意思 天天热资讯

1、Dota中的英雄,隐形刺客的简称2、职位名称:接车员(SA) 3、职位名称:销售助理(岗位编号NO 1SA)4、职

05-26 06:40:28

天天热点评!欧洲央行官员:利率仍须上调 并在一段时间内保持高位

欧洲央行管理委员会成员诺特表示,欧洲央行加息将至少延续到7月,利率一旦见顶,应在“相当长”时间内维...

05-26 05:47:15

两年期英债收益率两天飙涨超40个基点,投资者对英国央行加息预期升温-环球速递

两年期英债收益率两天飙涨超40个基点,投资者对英国央行加息预期升温:欧市尾盘,英国10年期国债收益率上涨

05-26 04:40:22

扁担还是扁担拼音_扁担的但是什么拼音

想必现在有很多小伙伴对于扁担的但是什么拼音方面的知识都比较想要了解,那么今天小好小编就为大家收集了一

05-26 03:41:21

武汉经济技术开发区 汉南区工商业联合会_环球新动态

1、武汉经济技术开发区(汉南区)工商业联合会。2、是湖北省武汉经济技术开发区(汉南区)工商界组成的人民

05-26 02:44:13

孜然牛肉炒香菇怎么做?
伊戈尔董秘回复:目前公司新能源产品主要应用在光伏发电领域
生意祝福语大全四字短句_生意祝福语大全四字
什么是tpp和fpp_tpp和fpp有什么区别 环球热议
李易峰出啥事了 pc是什么意思真相让人细思极恐具体情况详细内容介绍
每日简讯:异常!平安基金宣布:暂停!
当前热门:罗马狂欢节_关于罗马狂欢节介绍
天天热头条丨伦铜周五收涨超2%
中上协宋志平:提升“关键少数”规范意识和履职能力
每日快看:微信支付密码怎么找回(微信支付密码忘记了怎么找回)
梦幻联赛S20公布直邀队伍 中国Aster和LGD入选
天天热头条丨短歌行原文及翻译全文 短歌行原文及翻译赏析
西部矿业:5月26日融资买入2154.33万元,融资融券余额14.22亿元_全球速看
年内第八次释放松绑信号 南京出台多项公积金新政
Broe Group聘请工业房地产领导者领导新的铁路服务房地产平台_天天热消息
全球热推荐:榜妹热线 | 王俊凯也去街舞了?宋威龙刘浩存二搭?鞠婧祎没资源?李宏毅终于进组?毕雯珺新剧?
最新快讯!体面高音质mp3下载(体面mp3下载微盘)
a number of与the number of的用法区别(a number of 和the number of 的区别和用法) 天天通讯
市城市照明管理处安全大排查 保照明设施安全度汛
焦点快看:2023苏州端午节狮子林需不需要预约?怎么预约?
本周盘点(5.22-5.26):江龙船艇周跌5.41%,主力资金合计净流出5662.03万元
2023中关村论坛|北京国际科技创新中心建设如何?五个“北京经验”公布
面对新增领域的案件,仙霞新村街道综合行政执法队这样执法……_当前要闻
“节约粮食 光盘行动”节粮大讲堂暨主题探访活动点燃京城夏日 天天视点
他为何要对着列车敬礼?
环球今亮点!车联网提升/驾乘更舒适便捷 试驾全新捷达VS7高光版
南湾猴岛上新!沉浸式球幕穹顶天幕秀体验馆开工建设 环球快看
旅游市场如火如荼 从财报看一季度旅企“火候”如何?
中国将重点在四方面推进与中亚国家经贸合作
焦点观察:血糖飙升?试试这些茶叶帮助你掌控血糖
法尔克:拜仁目前对弗拉霍维奇不感兴趣
环球最新:盘后3股公布分红方案-更新中
消防员灭火后从角落救出一窝小奶猫
六国化工召开前4个月经济运行分析会 世界观天下
天天讯息:宁夏出台办法支持企业建设飞地研发中心
达州市加强基层党风廉政建设片区现场推进会召开
工行淮安洪泽支行积极推动“换卡不换号”服务工作|环球微动态
05月25日新房成交590套;涨价房源329套
【聚看点】演绎老北京一家人的喜怒哀乐,京味话剧《家宴》亮相通州
每日关注!京粮控股:融资净偿还55.06万元,融资余额1.54亿元(05-25)
韩自研火箭技术故障 发射取消 资讯
世界聚焦:武汉最高墙画竟然就在这里
被雷劈死的人是坏人吗(被雷劈死的人)
快讯:无花果酱的家常做法(制作无花果酱需要把洗净切好的)
sa是什么意思的_sa是什么意思 天天热资讯
天天热点评!欧洲央行官员:利率仍须上调 并在一段时间内保持高位
两年期英债收益率两天飙涨超40个基点,投资者对英国央行加息预期升温-环球速递
扁担还是扁担拼音_扁担的但是什么拼音
武汉经济技术开发区 汉南区工商业联合会_环球新动态
【世界报资讯】美国一季度实际GDP环比增速上修至1.3% 但国内总收入进一步收缩
X 广告
行业动态
X 广告

Copyright ©  2015-2022 华南植物网版权所有  备案号:粤ICP备18025786号-52   联系邮箱: 954 29 18 82 @qq.com