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

2023-05-13 16:35:54 来源: 程序员客栈

大家好,我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-13 16:35:54

“第二个董明珠”孟羽童,这一次,真的要出局了!

作者:智库君来源:首席商业智库孟羽童从格力离职了!一年半前,当董明珠高调宣布要把22岁的孟羽童培养成自

05-13 15:52:54

全球微头条丨选择大城市逐梦还是小城市安稳

前不久有位读者提了个关于offer选择的问题,他的背景还是不错的,本科中流985,保研到了top2,研究方向是和

05-13 14:38:08

【独家焦点】2023年5月13日三乙胺价格最新行情预测

中国报告大厅2023年5月13日三乙胺价格最新走势监测显示:常州市聚运物资有限公司报价机构,今日三乙胺(99

05-13 13:28:06

盘点杨澜商业版图:实控企业80多家,注册资金超73亿元 每日快讯

近日,资深传媒人士杨澜通过名下实控公司北京阳光天女传媒有限公司(以下简称:北京阳光传媒)发表声明辟谣

05-13 12:13:14

增强自主创新能力需要构建什么_增强自主创新能力需要构建 最新快讯

1、一.增强自主创新能力的重要意义增强自主创新能力,建设创新型国家的重要意义,需要从以下四个方面认识

05-13 11:00:22

小企业财务核算制度_小企业财务制度范本

1、财务管理制度的建立,要根据企业的具体情况来决定。2、一般管理制度包括:一、现金管理二、银行存款的管

05-13 10:01:47

据英国天空新闻:维珍轨道公司及其顾问已经告诉潜在投标人,提交最终报价的截止日期被推迟数日至5月19日。

据英国天空新闻:维珍轨道公司及其顾问已经告诉潜在投标人,提交最终报价的截止日期被推迟数日至5月19日。

05-13 09:13:41

查经纬度用什么地图_查经纬度 天天速看

1、1首先在百度首页或其他百度页面进入百度地图页面:2然后点击地图页面中右上角的“地图API”选项:3开...

05-13 08:41:09

中国恒大和许家印成被执行人,涉深深房重组需履行回购承诺及支付费用_百事通

5月12日晚间,中国恒大(03333 HK)公告称,许家印成为被执行人。公告显示,中国恒大收到广东省广州市中级

05-13 07:52:34

天天新资讯:赫敏格兰杰的扮演者_你一定认识她

欢迎观看本篇文章,小升来为大家解答以上问题。赫敏格兰杰的扮演者,你一定认识她很多人还不知道,现在让我

05-13 05:59:25

光伏逆变器排名前十名:上市公司净利率前10榜单(第四季度) 快讯

光伏逆变器排名前十名:上市公司净利率前10榜单(第四季度),南方财富网趋势选股系统财报工具数据整理,截

05-13 04:59:40

可爱扣扣昵称大全_比较可爱的网名

欢迎观看本篇文章,小柴来为大家解答以上问题。可爱扣扣昵称大全,比较可爱的网名很多人还不知道,现在让我

05-13 01:46:31

女子患精神分裂症二十余年,微创手术助精神病患家庭重拾希望_天天快消息

极目新闻记者曹洋通讯员王慧文幻听,自言自语,狂躁不安,冲动毁物……51岁的张女士(化姓)患精神分裂...

05-12 23:14:56

腾龙股份:拟不超2000万美元在马来西亚投资建厂|每日速看

  上证报中国证券网讯(记者孔子元)腾龙股份公告,公司拟在马来西亚新设全资子公司“常州腾龙马来西...

05-12 22:15:54

青岛莱西警方:网传疑似猥亵学生模样女子的警情通报为虚假通报

据青岛莱西融媒体中心5月12日消息,近日,网传一起关于疑似猥亵学生模样女子的警情通报,经公安机关核实系

05-12 21:15:13

【播资讯】张国伟回应直播卖煎饼亏本 粉丝笑称:送鸡蛋做福利

今日,山东烟台,粉丝偶遇了将前往韩国参加比赛的张国伟,双方热情互动。聊到前段时间在胡同摊煎饼的直播,

05-12 20:49:21

焦点资讯:高中物理学科网官网(高中学科网物理)

1、多看教科书,物理教材我认为是编得最好的一本 那里面知识全面易懂,可以看看每章前面的导语,能让你明白为

05-12 20:18:21

世界速看:乌军多地发起反攻,英国送来巡航导弹,俄军陷入恐慌

从去年底开始,俄乌战争就进入了一种胶着的状态双方都没有能力在短时间内制对手于死地,而只能在巴赫姆特这

05-12 19:33:08

2022年GDP十强县出炉,苏州这三个地方上榜!

2022年GDP十强县出炉,苏州这三个地方上榜!,苏州,江苏,昆山市,常熟市,十强县,张家港市

05-12 19:10:34

新疆农科院3个小麦新品种实现快速转化 商业化育种体系大幅缩短新品种推广转化周期

“以前需要3年完成的事现在不到1年就能完成。”5月11日,新疆农业科学院粮食作物研究所党支部书记周安定...

05-12 18:43:07

焦点滚动:富宝贷没逾期到期不还会上征信吗?

网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后

05-12 17:49:26

宁波中百:近期出售3135.4398万股西安银行股票,产生含税收入约1.49亿元

宁波中百5月12日公告,公司于2023年5月10日至5月11日通过上海证券交易所交易系统以集中竞价交易方式,出售

05-12 17:34:36

品质为根电动化发力!一汽丰田行稳致远未来可期

文|海淀莫少编辑|小丸子守住品质之根,QDR做精做细!随着bZ3及后续纯电动车产品的相继投放,一汽丰田有望在

05-12 16:58:39

【世界快播报】@你的宝,带你去五指山提“爱马仕”“劳斯莱斯”!

咳咳~实不相瞒瓦们五指山奢侈品可多了什么“爱马仕”“莱斯莱斯”都是满山满山的还有“皇后”哟言归正传...

05-12 16:46:27

世界资讯:百元股数量较高位减少四成 部分百元股较高点跌超50%

读特客户端·深圳新闻网2023年5月12日讯(深圳商报记者钟国斌)上证指数3300点上方震荡,但A股百元股出现减

05-12 16:19:24

突出“国际化、专业化、市场化” 2023世界动力电池大会将呈现5大亮点

2023世界动力电池大会将于6月8日至11日在宜宾市举行。

05-12 16:18:26

当前短讯!居间合同审核程序不规范等,中辉期货山西省分公司被出具警示函

据山西证监局网站消息,5月12日,山西证监局公布关于对中辉期货有限公司山西省分公司采取出具警示函措施的

05-12 15:55:31

今日快讯:詹姆斯:不会去研究假摔 我们乐于进行身体对抗

北京时间5月11日,NBA季后赛西部半决赛G5,金州勇士121-106洛杉矶湖人,将系列赛大比分扳成2-3。湖人主将詹姆

05-11 19:23:24

枪支暴力肆虐!美国男子向无辜顾客开枪致1死2伤

中新网5月11日电据美联社报道,美国密歇根州底特律市一男子日前因4美元与加油站店员发生争执,于是在店内向

05-11 18:10:42

追梦谈G6:湖人不会把胜利拱手相让 我们仍然面临淘汰

直播吧5月11日讯NBA西部半决赛G4,勇士主场121-106击败湖人,总比分仍2-3落后,赛后,勇士球员追梦接受了记

05-11 17:26:09

[快讯]欧密格公布2022年年度分红实施方案|速看

CFi CN讯:欧密格(股票代码:832059)公布2022年年度权益分派实施公告。1、该公司2022年年度权益分派方案

05-11 17:08:37

惠安文化产业交出亮眼“成绩单”

今年以来,惠安县加快推动文化产业高质量发展,聚力主题活动打造、项目建设带动、市场主体培育,通过加强指

05-11 16:26:47

外交部:愿为推动乌克兰危机的政治解决继续发挥建设性作用 世界观天下

外交部:愿为推动乌克兰危机的政治解决继续发挥建设性作用

05-11 16:03:15

中央财政支持博物馆纪念馆免费开放 补助资金合计达34.4亿元-世界热议

人民网北京5月11日电(记者任妍)记者从财政部获悉,根据《关于全国博物馆、纪念馆免费开放的通知》精神,

05-11 15:53:53

美国Q1半导体进口额同比增长13% 亚洲仍是主要来源_天天视讯

智通财经APP获悉,今年前三个月,美国半导体进口额达154亿美元,同比增长了13%,这表明美国要满足其国内芯

05-11 15:06:47

商品期货早盘收盘多数下跌,沪镍跌超4%,棕榈油跌超3% 全球聚看点

金融界5月11日消息国内期货市场早盘收盘,商品期货多数下跌,沪镍跌超4%,棕榈油跌超3%,纯碱、豆油、工业

05-11 14:36:23

信用卡欠款负债35万无力偿还,家人需要还吗 全球快报

不会强制家人还款,但是家人可以代还。可能会强制配偶还款,因为婚姻关系续存期间夫妻的财产是共同财产,债

05-11 14:04:27

视讯!征途zt325官网 征途电子狗zt325升级

今天来聊聊关于征途zt325官网,征途电子狗zt325升级的文章,现在就为大家来简单介绍下征途zt325官网,征途电子狗

05-11 13:26:04

工商银行龙凤呈祥金条25克价格今天多少一克(2023年05月11日)

金投网提供工商银行龙凤呈祥金条25克价格今天多少一克(2023年05月11日),工商银行龙凤呈祥金条25克价格最

05-11 12:44:40

郎溪县2023年特色种养业奖补标准:种植蔬菜每亩补助多少?

近日,郎溪县政府发布《郎溪县2023年特色种养业提升行动到户项目奖补办法》,全县有能力有产业发展意愿且需

05-11 12:18:53

北京加强区域性股权市场监督管理 规范经营行为

5月11日,为加强北京市区域性股权市场监督管理,北京市地方金融监督管理局近日发布《北京市区域性股权市场

05-11 11:47:05

抓住旅游消费新机遇

这段时间,大学生利用课余时间“特种兵”式旅游在社交媒体引发热议。其高强度的行程安排、旋风式“打卡...

05-11 11:18:30

当前资讯!张国立“访”鸡血石、华少“侃”钱王传说、王铮亮“设宴”青山湖……明星大咖们为何来“临”取景?

还记得上周启动的临安“全域取景地计划”吗?“一城五区百景”之美令各剧组怦然心动。这不,浙江卫视《...

05-11 10:52:02

让“诗和远方”的故事更精彩(暖闻热评) 天天动态

【关键词】旅游专列【事件】春暖花开,我国旅游市场快速升温,人们出游意愿高涨。近段时间,不少地方以旅客

05-11 10:34:37

全球快消息!318部动漫作品入围终评 “金海豚奖”颁奖仪式5月25日举行

台海网5月11日讯(海峡导报记者崔晓旭通讯员洪慧敏)5月6日-8日,2023年(第十五届)厦门国际动漫节“金海

05-11 10:12:10

云南师范大学美术专业怎么样录取分数线的

1、云南师范大学美术专业怎么样我是云南的,如果你是音乐或者美术类专业,推荐文华,我文华毕业的,但是口

05-11 09:39:10

全球速读:武动乾坤之冰心在玉壶(关于武动乾坤之冰心在玉壶介绍)

1、《武动乾坤之冰心在玉壶》是由深蓝影业、优酷视频、北京世纪伙伴文化、悦凯影视、阅文集团联合出品,张

05-11 09:10:59

丰田宣布将在电动汽车领域追加投资1万亿日元

如果实现,丰田将向其在2026财年销售150万辆电动车和2030年销售350万辆电动车的目标更近一步

05-11 08:51:47

世界快播:员工在办公场所沙发旁猝死认定工伤引争议

法院认为,事发地点属工作岗位自然延伸的合理区域,视同工伤(副题)中工网讯(工人日报-中工网记者卢越)

05-11 07:56:59

“第二个董明珠”孟羽童,这一次,真的要出局了!
全球微头条丨选择大城市逐梦还是小城市安稳
【独家焦点】2023年5月13日三乙胺价格最新行情预测
盘点杨澜商业版图:实控企业80多家,注册资金超73亿元 每日快讯
增强自主创新能力需要构建什么_增强自主创新能力需要构建 最新快讯
小企业财务核算制度_小企业财务制度范本
据英国天空新闻:维珍轨道公司及其顾问已经告诉潜在投标人,提交最终报价的截止日期被推迟数日至5月19日。
查经纬度用什么地图_查经纬度 天天速看
中国恒大和许家印成被执行人,涉深深房重组需履行回购承诺及支付费用_百事通
天天新资讯:赫敏格兰杰的扮演者_你一定认识她
光伏逆变器排名前十名:上市公司净利率前10榜单(第四季度) 快讯
可爱扣扣昵称大全_比较可爱的网名
女子患精神分裂症二十余年,微创手术助精神病患家庭重拾希望_天天快消息
腾龙股份:拟不超2000万美元在马来西亚投资建厂|每日速看
青岛莱西警方:网传疑似猥亵学生模样女子的警情通报为虚假通报
【播资讯】张国伟回应直播卖煎饼亏本 粉丝笑称:送鸡蛋做福利
焦点资讯:高中物理学科网官网(高中学科网物理)
世界速看:乌军多地发起反攻,英国送来巡航导弹,俄军陷入恐慌
2022年GDP十强县出炉,苏州这三个地方上榜!
新疆农科院3个小麦新品种实现快速转化 商业化育种体系大幅缩短新品种推广转化周期
焦点滚动:富宝贷没逾期到期不还会上征信吗?
宁波中百:近期出售3135.4398万股西安银行股票,产生含税收入约1.49亿元
品质为根电动化发力!一汽丰田行稳致远未来可期
【世界快播报】@你的宝,带你去五指山提“爱马仕”“劳斯莱斯”!
世界资讯:百元股数量较高位减少四成 部分百元股较高点跌超50%
突出“国际化、专业化、市场化” 2023世界动力电池大会将呈现5大亮点
当前短讯!居间合同审核程序不规范等,中辉期货山西省分公司被出具警示函
今日快讯:詹姆斯:不会去研究假摔 我们乐于进行身体对抗
枪支暴力肆虐!美国男子向无辜顾客开枪致1死2伤
追梦谈G6:湖人不会把胜利拱手相让 我们仍然面临淘汰
[快讯]欧密格公布2022年年度分红实施方案|速看
惠安文化产业交出亮眼“成绩单”
外交部:愿为推动乌克兰危机的政治解决继续发挥建设性作用 世界观天下
中央财政支持博物馆纪念馆免费开放 补助资金合计达34.4亿元-世界热议
美国Q1半导体进口额同比增长13% 亚洲仍是主要来源_天天视讯
商品期货早盘收盘多数下跌,沪镍跌超4%,棕榈油跌超3% 全球聚看点
信用卡欠款负债35万无力偿还,家人需要还吗 全球快报
视讯!征途zt325官网 征途电子狗zt325升级
工商银行龙凤呈祥金条25克价格今天多少一克(2023年05月11日)
郎溪县2023年特色种养业奖补标准:种植蔬菜每亩补助多少?
北京加强区域性股权市场监督管理 规范经营行为
抓住旅游消费新机遇
当前资讯!张国立“访”鸡血石、华少“侃”钱王传说、王铮亮“设宴”青山湖……明星大咖们为何来“临”取景?
让“诗和远方”的故事更精彩(暖闻热评) 天天动态
全球快消息!318部动漫作品入围终评 “金海豚奖”颁奖仪式5月25日举行
云南师范大学美术专业怎么样录取分数线的
全球速读:武动乾坤之冰心在玉壶(关于武动乾坤之冰心在玉壶介绍)
丰田宣布将在电动汽车领域追加投资1万亿日元
世界快播:员工在办公场所沙发旁猝死认定工伤引争议
高贺迪图 高贺迪
X 广告
行业动态
X 广告

Copyright ©  2015-2022 每日植物网版权所有  备案号:浙ICP备2022016517号-15   联系邮箱:5 146 761 13 @qq.com