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

大家好,我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

04-26 15:53:59

推进中医药工作先行先试,浦东预防保健人员将实现“中西医结合”

近日,浦东新区第二期“非中医类别人员中医药知识与技能培训”开班,至此,全区预防保健人员全部参加了...

04-26 15:07:06

比亚迪在智利获得磷酸铁锂正极材料生产资质和建厂许可|天天视点

4月26日消息,比亚迪智利分公司与智利生产促进委员会(CORFO)就锂电池材料生产达成协议,宣布比亚迪在智利

04-26 14:52:17

世界快看点丨2023年一季度宁夏各市GDP排行榜 银川排名第一 吴忠排名第二

2023年一季度宁夏各市GDP排行榜银川排名第一吴忠排名第二

04-26 14:15:40

乘联会崔东树:4月汽车零售批发市场均有望实现较强同比增长-当前热讯

对于4月车市的整体表现,全国乘联会秘书长崔东树预计,4月零售、批发市场均有望实现同比较强增长。未经第一

04-26 13:53:47

【环球快播报】有退休金可以申请五保户吗?低保户又是什么?

有退休金可以申请五保户吗?低保户又是什么?随社保网小编来看看。这是不能的的,不符合条件的。所谓的五保

04-26 13:04:58

日均开行97.5对 海南铁路加大运力保障“五一”假期旅客出行_全球信息

新海南客户端、南海网、南国都市报4月26日消息(记者王小畅通讯员陈可瑞)记者从海南铁路海口车务段获悉,

04-26 12:36:46

当前速递!西足协通报:继上周之后,本周又有两起针对裁判的暴力事件

直播吧4月25日讯上周,执法西班牙U19联赛的主裁判安东尼奥-波佐赛后在球场外遭遇围殴,为此裁判委员会已经

04-26 11:49:52

资讯:右手大拇指发麻是什么病征兆_右手大拇指发麻是什么原因造成的

1、右手拇指麻木是因为支配右手拇指的感觉神经出了问题。这种情况属于周围神经病变,最常见的原因是神经被

04-26 11:54:53

南阳武侯祠门票价格+优惠政策

南阳武侯祠门票价格及优惠政策门票:50元 人一、半价票(1)18周岁以下(不含18周岁)未成年人凭身份证件享受半

04-26 11:30:26

湖南启动科技创新成果路演活动

4月25日,“湖南省科技创新成果路演”在长沙宣布启动。同日,该活动进行了首轮路演,100余项高质量科技...

04-26 11:03:35

大雁塔小学西沣分校开展校级教学能手展示活动

阳光讯(记者杨小娟)4月18日至21日,大雁塔小学西沣分校开展了校级教学能手展示活动。大雁塔小学西沣分校

04-26 10:50:47

【世界热闻】大新料香港今年全年整体出口跌幅可能介乎5%至10%

4月26日,大新银行经济研究及投资策略部表示,香港3月整体出口按年跌幅显着收窄至1 5%,是去年中以来最小跌

04-26 10:17:03

大风起兮云飞扬威加海内兮归故乡安得猛士兮守四方翻译-大风起兮云飞扬威加海内兮归故乡安得猛士兮守四方

1、刘邦在战胜项羽后,成了汉朝的开国皇帝。2、这当然使他兴奋、欢乐、踌躇满志,但在内心深处却隐藏着深刻

04-26 09:45:33

SMM锡早讯:昨日现货贸易成交清淡 夜盘锡价再度下跌

昨日早盘期间贸易市场中小牌贴水再度扩大至1000元 吨,市场中部分贸易企业的交割品牌锡锭也处于小幅贴

04-26 09:34:33

今日精选:皇马感受拜仁的痛!世界第一中卫被打爆,无名小辈让巴萨仰望!

银河战舰皇家马德里作为西甲的卫冕冠军,本赛季联赛表现不佳,早早就被死敌巴塞罗那甩在身后,前三十轮战罢

04-26 09:04:31

全球速看:科技巨头纷纷布局 人工智能“iPhone时刻”已到?

图虫创意 供图证券时报记者严翠2023年,ChatGPT(微软投资的OpenAI公司研发的聊天机器人)“横空出世”,其

04-26 08:32:46

微信朋友圈可以看访客记录吗_微信朋友圈怎么看访客记录

欢迎观看本篇文章,小柴来为大家解答以上问题。微信朋友圈可以看访客记录吗,微信朋友圈怎么看访客记录很多

04-26 08:01:10

“三新”折射经济企稳回升态势延续 天天新消息

从出口“新三样”、消费“新业态”、投资“新项目”相关数据来看,经济企稳回升态势延续。专家认为,受...

04-26 06:53:31

环球快资讯:我市推行企业开办一站式服务

本报讯“前些年我注册公司,需要来回跑好几个部门,最快也得两三天才能办好,现在到家门口的银行网点就...

04-26 05:57:31

天天热点评!万年县气象台更新大雾橙色预警信号【II级/严重】【2023-04-26】

万年县气象台更新大雾橙色预警信号【II级 严重】【2023-04-26】

04-26 05:04:05

正楷字28个基本笔画写法 正楷字

今天来聊聊关于正楷字28个基本笔画写法,正楷字的文章,现在就为大家来简单介绍下正楷字28个基本笔画写法,

04-26 03:10:21

村民贴近生活的法律常识_生活中的一些法律常识|天天关注

1、婚姻法用于处理夫妻家庭关系,子女抚养关系,感情破裂离婚时必用2、继承法用于老人去世后遗产的分配与继

04-26 01:43:56

世界今日讯!里昂:重申福莱特玻璃买入评级 目标价27.7港元

里昂发布研究报告称,重申福莱特玻璃(06865)“买入”评级,目标价由28 7港元下调至27 7港元。公司首季利

04-26 00:01:26

神奇动物格林德沃之罪 百度网盘_神奇动物格林德沃之罪百度云 全球动态

1、神奇动物格林德沃云资源已保存个人百度网盘。本文到此分享完毕,希望对大家有所帮助。

04-25 23:05:05

天天头条:【环时深度】菲与美“忽远忽近”,背后是这些爱恨情仇

【环球时报驻菲律宾特约记者 肖岩】“尽管菲律宾总统马科斯不忘强调‘美国可以进入的菲军事基地不会被...

04-25 22:12:10

LAF | 前沿报告:“学述”对话——埋下环境保护的种子

国内首家中文网络媒体、79家中央新闻网站之一。内容涵盖国家公派留学、自费出国留学、国际教育、教育科技人

04-25 21:42:42

鸟山明在干嘛_鸟山明死了没有

1、没死呢。2、他只是不喜欢被催稿而且老了所以不画了。3、不过之前在龙珠的周年庆上他又执笔画了龙珠的全

04-25 21:00:38

公司财务制度 公司财务 天天报资讯

今天来聊聊关于公司财务制度,公司财务的文章,现在就为大家来简单介绍下公司财务制度,公司财务,希望对各

04-25 20:03:59

电报解读|中复神鹰(688295.SH)产销释放叠加产品升级-全球热门

精品VIP投研内容

04-25 19:46:13

上海国际能源交易中心、山东京博石油化工有限公司合作举办第二期能源产业基地培训 每日讯息

4月25日,上海期货交易所(下称上期所)、上海国际能源交易中心(下称上期能源)与山东京博石油化工有限公

04-25 19:02:15

网上出现“专升本”试卷照片?江西教育考试院:未发现试题外泄等情况

原标题:网上出现“专升本”试卷照片?江西教育考试院:未发现试题外泄等情况央视网消息:据江西省教育...

04-25 18:28:55

我国全面实现不动产统一登记意味着什么?不动产统一登记后房子会不会便宜?|世界播资讯

2023年4月25日星期二,全国自然资源和不动产确权登记召开工作会议,会上自然资源部部长王广华表示我国全面

04-25 18:02:33

环球最新:目前国内黄金价格查询(2023年4月25日)

目前国内黄金价格查询(2023年4月25日)

04-25 17:35:03

非东莞户籍的可以申请东莞谢岗银屏公租房么?_世界今热点

非东莞户籍的可以申请东莞谢岗银屏公租房么?答:可以的,非户籍满足下面的条件可以申请。一、新就业无房职

04-25 17:13:46

每日信息:务川县税务局开展“悦读青春·书香务川”青年读书会

为迎接第28个世界读书日,进一步倡导“书籍是人类进步的阶梯”的社会氛围,推进“书香务税”建设,4月23...

04-25 16:43:28

专利研发专项审计报告有哪几种类型_审计报告有哪几种类型_即时

1、一、从审计报告的标准来划分,审计报告分为标准审计报告和非标准审计报告。2、二、从审计报告的意见类型

04-25 16:16:35

风华高科:公司祥和项目三期目前正在推进项目建设

风华高科4月25日在互动平台表示,公司祥和项目三期建设已于今年3月启动试生产,目前正在抓紧推进项目建设,

04-25 16:04:47

看环境 | 省财政厅:15项举措推动政采营商环境再突破_天天热讯

本报讯(记者苏怡)4月18日,记者从省财政厅获悉:为打造一流的政府采购营商环境,近期该厅印发《关于进一

04-25 15:30:09

世界播报:甘肃定西“一日办结”提高营商环境“吸粉力”

截至今年3月底,定西市注册登记各类市场主体211898户,同比增长10 4%。

04-25 15:06:13

“公奔私”后表现如何?多位基金经理业绩提升!6位业绩逆袭!

基金行业有句老话,“公募的终点是私募”。私募基金行业相对自由和灵活,投资策略也更加多样化,因此能...

04-25 14:24:51

京杭运河杭州段沉没运沙船已成功打捞

最新消息——4月25日上午,潮新闻记者从京杭运河杭州段建北桥水域船舶沉没事故现场了解到,事故货船已被...

04-25 14:12:21

高端抗衰有了“细胞级”新方案,解码NAD+如何带来“逆生长”

拥有50余年品牌经验的Swisse斯维诗早早躬身入局,打造了进口药房级高端营养健康品牌SwissePLUS,并推出两款

04-25 13:59:21

环球今日讯!雅思_雅思和托福的区别

你们好,最近小活发现有诸多的小伙伴们对于雅思,雅思和托福的区别这个问题都颇为感兴趣的,今天小活为大家

04-25 13:44:54

秦皇岛心理咨询师报考条件要求-全球短讯

秦皇岛心理咨询师报考条件要求,秦皇岛市海港区、山海关区、北戴河区、抚宁区、青龙满族自治县、昌黎县、卢

04-25 13:21:04

阿莱德:公司的导热产品可以应用于数据中心的相关硬件设备,具体业务信息请关注公司披露的相关公告

阿莱德(301419)04月25日在投资者关系平台上答复了投资者关心的问题。

04-25 12:55:41

全球新消息丨甘州区南街街道佛城社区开展助残服务活动

甘州融媒讯为做好2023年残疾人基本服务状况与需求信息数据动态更新工作,进一步建立健全残疾人基础数据,全

04-25 12:27:47

Steam好评免费游戏《下雨把人分隔》即将有官中_世界快消息

近日,由D10RAMA开发并发行的Steam“特别好评”的免费游戏《下雨把人分隔(雨にして人を外れ)》即将添...

04-25 12:12:41

V观财报|*ST商城及董事长、董秘被警示:未及时披露诉讼进展

V观财报|*ST商城及董事长、董秘被警示:未及时披露诉讼进展,董秘,诉讼,证监局,上交所,中信银行,*st商城,上

04-25 12:03:37

速递!泌阳县应急管理局赴国家陆地搜寻与救护平顶山基地学习交流

为进一步加强综合应急救援队伍建设,提升应急救援队伍矿山应急救援技能和现场处置能力,近日,泌阳应急管理

04-25 12:18:08

当前观察:华瑞科技2022年净利415.68万同比扭亏为盈 销售逐步恢复正常、收入增加
环球视点!法国人越来越爱纹身!你还对它抱有偏见吗?
中国首次火星探测火星全球影像图发布
我国职业健康事业快速发展 重点职业病高发势头得到初步遏制 环球速读
当前热文:专科志愿如何填报视频可以用线差法吗
今日南财市场情绪指数为35.6,市场投资热度明显降低
隆回县西洋江镇:大力开展“微心愿”认领 为群众暖心圆梦 环球通讯
天天快讯:免费学技术 就业有门路
ProGrade Digital 的最新软件可让您更新存储卡的固件 热点评
焦点报道:天津公交线路查询-新浪博客(天津公交线路查询)
公司问答 | 概伦电子:公司EDA软件的软件授权许可文件(License)管控机制有相应规范措施
环球快看点丨清华大学教授发现:凡是有出息的宝贝,妈妈都具备这3个特征!
新消息丨治堵深入时丨缓解普朱景区交通拥堵压力 3条公交专线“五一”上线 2条专线可免费乘坐
孙中山最后的日子 世界热点
第十八届中国会展经济国际合作论坛在浙江绍兴开幕_当前视讯
曹德旺炮轰特斯拉工资太高?福耀集团辟谣! 每日热讯
百万捐款“善佑”先天性小耳畸形儿童
今日上市:荣旗科技、民士达
Soul递交上市招股书 不惧行业寒冬实现逆境增长
三全食品4月25日盘中涨幅达5%
金刚2之金刚复活结局_金刚2之金刚复活完整版
空气炸锅要不要垫油纸?空气炸锅的用法是什么?
一季度新增就业297万人 2023年“三支一扶”计划选派3.4万名高校毕业生|天天视点
发布招聘的帖子_发招聘帖子怎么发
使用数字人民币发的工资,是种什么体验?|焦点速读
北京将申办2027年田径世锦赛|天天播资讯
北京:养老机构模拟失火 随机考验处置能力 全球聚焦
中际旭创高端出货占比上升盈利12亿 年内股价涨两倍谢治宇跻身前十股东 环球报资讯
全球热头条丨孩子悄悄变好的12个征兆
环球观焦点:意甲-佩7破门帕特里西奥送礼 罗马1-3亚特兰大降至第五
六台记者:梅西比以往任何时候都更接近回归巴萨 决定权在西甲手中-环球微动态
天风证券:AI赋能制造业道路 传统安防龙头估值逻辑切换
青瓷游戏于成都设立新公司 微速讯
捷昌驱动(603583)2023年一季报简析:净利润减82.39%,三费占比上升明显|全球快资讯
人民财评:燃旺人间“烟火气”-天天速看料
世界速递!新·哥斯拉_关于新·哥斯拉简介
环球观热点:方头大耳的意思及拼音_方头大耳的意思
环球热议:真空度的原理_真空度
控卫是干什么的_控卫 焦点信息
我国将加快推动完成专利法实施细则修改
电脑开机广告弹窗太多了_电脑开机广告弹窗太多
世界球精选!2019年,山西小伙娶亚美尼亚美女硕士,经历战争后携妻儿回国定居
金钼股份公布2022年年度权益分配预案 拟10派3元 天天新资讯
昆山张浦:提升精细化管理水平 环球播报
世界观点:经济观察丨避险搬迁+工程治理 30余万山区群众远离地灾威胁
东丽区发布四大主题活动 28项农商文旅体活动贯穿全年
图解赛为智能年报:第四季度单季净利润同比增45.39%
焦点资讯:青椒的功效与作用
康健园|共“童”守护 乐享成长 接种疫苗是预防轮状病毒感染最佳公共卫生手段-全球速读
厦门:冷、雨、风!气温重回“1”字头……|环球今日报
x 广告
x 广告

Copyright ©  2015-2022 欧洲纤维网版权所有  备案号:沪ICP备2022005074号-23   联系邮箱: 58 55 97 3@qq.com