解剖屎山,寻觅黄金之第二弹
大家好,我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服务
标签:
上一篇:信息:误发“福建古田4.2级地震”预警信息 官方致歉
下一篇:最后一页
- 周黑鸭股价突然闪崩跳水 市值蒸发32亿港元
- 环球头条:中国外汇交易中心:调整CFETS人民币汇率指数和SDR货币篮子人民币汇率指数的货币篮子权重
- 【报资讯】12月29日蚂蚁集团概念股板块十大牛股一览
- 战胜病毒 肠道免疫力有啥作用?_环球精选
- 快报:优信巴士逾期八年不还利息怎么算
- 热文:45岁左小青带家人打网球,衣着朴素好优雅,与富豪离婚后状态佳
- 环球焦点!辉煌科技(002296.SZ):中标7572.02万元西安地铁监控系统集成项目
- 九联科技董秘回复:公司的AR/VR虚拟现实产品可应用于文旅、教育等领域场景
- 世界观点:叮当钱包借款逾期10个月不还征信有什么影响
- 全球视讯!丰原药业:对于老年重症患者应及时就医,并遵循医嘱用药
- 如何看待中国将失去“第一人口大国”地位?
- 嘉能嘉运营方中食科技及关联企业与人员被异地法院财产保全
- 社评:解放军的行动,不仅是为了震慑“台独”-焦点热门
- 宜兴市免费退烧药领取地点_热文
- 提名影帝后沦落街头!月入不到200元,他怎么成了这样?
- 2023贺岁纪念币合肥邮政储蓄银行预约方式(附预约入口)
- 世界热点!2023兔年贺岁纪念币珠海兑换银行网点(工商/农业/邮政)
- 光弘科技:12月26日获融资买入280.33万元,占当日流入资金比例19.97%
- 四川长虹: 四川长虹独立董事关于公司第十一届董事会第四十九次会议相关事项的事前认可意见-每日快播
- 奥翔药业: 奥翔药业第三届监事会第十三次会议决议公告
- 全球百事通!《财阀家的小儿子》女主背叛男主了吗 女主结局是什么
- 妮可拉圣诞献吻,小贝长子秀恩爱!融入富豪家族,不陪爹妈兄妹
- 焦点滚动:今年春运集中式客流或将变分散 热门线路火车票仍有余票
- 织牢基层医疗服务网——重庆两江新区创新机制强化重点人群保护 环球视点
- 世界视点!博杰股份: 关于召开2023年第一次临时股东大会的通知
- 直击调研 | 南山控股(002314.SZ):宝湾物流已与各地发改委进行项目沟通和事项审批
- 全球速讯:中京电子:公司持续为荣耀手机提供配套产品服务
- 天天快看点丨吉美达任命焦立然为公司财务负责人2022上半年公司净利152.9万
- 天天热点!润都股份:公司通过外购途径取得布洛芬原料药
- 当前最新:悦康药业(688658)12月21日主力资金净卖出1458.29万元
- 宁波能源: 宁波能源七届三十四次董事会决议公告-世界简讯
- 天臣医疗:公司产品拟中标福建等15省市医用耗材省际联盟集中带量采购 速看
- 冯仑:人脉不是经营出来的,价值观和实力更重要 天天要闻
- 天天实时:e点贷款逾期了还会上征信系统吗
- 今日快讯:港股早评:恒指低开1% 内房股大跌居前 教育股继续上涨
- 财税政策支持民营企业轻装前行 全球微动态
- 白猫贷逾期八个月多久上征信系统_全球今亮点
- 奇正藏药董秘回复:从已经公开的文献看,藏医对呼吸道传染性疾病_热推荐
- 守护安全防线!太康县应急管理局开展涉氨企业安全检查-全球实时
- 大s放长线,钓大鱼才是最明智的做法|当前热议
- “露营+”经济按下加速键 产业链企业抓紧布局_天天热文
- 世界资讯:12月16日基金净值:广发恒信一年持有期混合A最新净值1.0111,跌0.13%
- 世界热头条丨李宁牌羽毛球价格表
- 货拉拉助力新动能 数字货运在路上 环球看热讯
- 中金公司:MLF放量续作有助于改善债市负反馈 债市需求有望回暖_全球通讯
- 华铁应急董秘回复:公司可转债发行申请已获得中国证监会受理
- 马蜂窝联合多彩贵州网发布《贵阳冬季玩法攻略》-世界热推荐
- 环球观热点:蓄电池(蓄电池品牌)
- 匿名锦旗 彰显巡察责任担当
- 中国武夷:公司的现金流状况良好
-
河化股份(000953.SZ):5%以上股东何建国方面累计减持1%股份
格隆汇12月13日丨河化股份公布,2022年10月28日至本公告披露日,公司持股5%以上股东何建国及其一致行动...
-
焦点速递!车祸对方全责该如何处理?
可以要求对方承担全部赔偿责任。对交通事故损害赔偿的争议,当事人可以请求公安机关交通管理部门调解,...
-
ITP HOLDINGS(08446.HK)拟向ST Ma增发1315.79万股 净筹5900万港元
格隆汇12月12日丨ITPHOLDINGS(08446 HK)公告,于2022年12月12日,公司与STMa订立股份认购协议,据此,...
-
三六五网(300295)12月12日主力资金净卖出1448.51万元
截至2022年12月12日收盘,三六五网(300295)报收于9 25元,下跌3 95%,换手率5 72%,成交量9 65万手...
-
环球快看点丨光大证券:磷肥及磷化工行业有望维持较高景气
(原标题:光大证券:磷肥及磷化工行业有望维持较高景气)证券时报e公司讯,光大证券研报指出,后续伴随...
-
每日速讯:葫芦娃董秘回复:公司目前没有北美和欧洲业务,未来拓展规划请关注公司公开披露的信息
葫芦娃(605199)12月09日在投资者关系平台上答复了投资者关心的问题。投资者:尊敬的董秘,您好。急问贵...
-
灿能电力拟向招商银行申请不超1000万元综合授信正常生产经营所需-全球快播报
挖贝网12月8日消息,灿能电力(870299)拟以信用方式向招商银行南京分行申请不超过。1,000万元的综合授...
-
环球快资讯丨戴蒙:通胀将令美国明年陷入衰退 俄乌冲突凸显油气的必要性
(原标题:戴蒙:通胀将令美国明年陷入衰退俄乌冲突凸显油气的必要性)财联社12月7日讯(编辑赵昊)当地...
-
新一期“麻辣粉”如期公布 央行续作4000亿元逆回购操作
新一期麻辣粉和逆回购操作如期公布。9月15日,央行发布消息称,为维护银行体系流动性合理充裕,开展4000...
-
今年上半年郑州市居民人均可支配收入20504元 同比增长3.8%
国家统计局郑州调查队近日发布监测数据显示,今年上半年,郑州市居民人均可支配收入20504元,同比增长3...
-
打破性别“玻璃天花板” 95岁女院士是“她力量”最佳代言
鼓励女性打破“玻璃天花板” 95岁女院士就是“她力量”最佳代言 打破性别“玻璃天花板”,锤子...
-
中国记者节|今天,一起揭秘他们的独门“武功秘籍”
中国记者节|今天,一起揭秘他们的独门“武功秘籍” 天下武功,招式多变 百行百业,均有洞天...
-
内蒙古通辽遭遇特大暴雪:学校停课 机场关闭
中新网通辽11月8日电 (记者 李爱平)8日午间,记者从内蒙古自治区通辽气象局获悉,北方草原都市内...
-
河北辛集市暂停举办体育活动 关闭景区文娱场所
今天(11月8日)上午,河北省辛集市召开疫情防控新闻发布会,通报当地疫情防控最新情况。辛集市文体局...
-
红色文物·党史故事 “推出胜利”的小推车
“推出胜利”的小推车 李晓莉 在淮海战役纪念馆中,有一辆小推车格外引人注目,它就是淮海...
-
侵华日军南京大屠杀遇难同胞纪念馆闭馆
中新网南京11月8日电(记者 申冉)8日,侵华日军南京大屠杀遇难同胞纪念馆通报,该馆定于2021年11月1...
-
甘肃:已治愈出院18例 闭环健康管理助回归家庭
(抗击新冠肺炎)甘肃:已治愈出院18例 闭环健康管理助回归家庭 中新网兰州11月8日电 (记者 徐...
-
核酸采样:一位“点长”的50小时冲刺
11月4日晚上9点过,巴南区桥南社区盛世江南小区临时核酸采样点,市第七人民医院眼耳鼻喉科护士长张...
-
跑道结冰 哈尔滨机场关闭至9日12时
中新网哈尔滨11月8日电 (仇建 记者 史轶夫)哈尔滨太平国际机场8日发布消息,因跑道结冰,该机场...
-
辽宁大连迎今冬首场降雪 机场临时关闭跑道地铁3号线停运
中新网大连11月8日电 (记者 杨毅)7日晚开始,辽宁省大连市迎来入冬以来首场降雪。受此影响,大连...
-
北京地铁全面开启车内加热装置
地铁全面开启车内加热装置 本报讯(记者 李博)为做好降雪和强降温天气的应对工作,北京地铁合理...
-
黑河市多举措保障疫情期间残疾人等特殊群体生活稳定
中新网黑河11月8日电 (记者 史轶夫 王琳)8日,黑河市新冠肺炎疫情防控工作第十五场新闻发布会召...
-
北京丰台海淀两处管控区域解封 社区工作者收到“暖心礼物”
丰台海淀两处管控区域解封 居民和社区工作者收到“暖心礼物” 本报记者 孙颖 于丽爽 昨...
-
百年兰州牛肉面的“隔离与亲近”
(抗击新冠肺炎)百年兰州牛肉面的“隔离与亲近” 中新网兰州11月8日电 (记者 丁思)兰州多家牛肉...
-
暴雪侵袭黑龙江 9地市最大雪深17厘米
中新网哈尔滨11月8日电(矫玲玲 记者姜辉)7日起,黑龙江省迎来一场降雪天气,14个站点降雪量达暴雪...
-
吉林四平一旅游项目违占耕地两千多亩 投资达10亿元
吉林四平一旅游项目违占两千多亩耕地被通报,投资达10亿元 近日,自然资源部通报了29宗农村乱占...
-
湖南双峰27名非法滞留缅北人员被惩戒:小孩回原籍入学
湖南双峰籍27名非法滞留缅北人员被惩戒:其小孩一律回原籍入学 为打击跨境电信诈骗犯罪,全国多...
-
江西新增本土“1+6” 上饶增一中风险地区
(抗击新冠肺炎)江西新增本土“1+6” 上饶增一中风险地区 中新网南昌11月8日电 (记者 吴鹏泉)...
-
江西上饶一地调整为中风险地区 实行封闭管理措施
中新网11月8日电 据江西省上饶市政府新闻办公室官方微博消息,上饶市新冠疫情防控应急指挥部8日发...
-
西宁市主城区首轮全员核酸采集样本144.8万份 结果均为阴性
中新网西宁11月8日电(胡贵龙 祁增蓓)记者8日从青海省西宁市新冠肺炎疫情防控处置工作指挥部第四场...
-
快递旺季遭遇雨雪天气 国家邮政局呼吁理解快递小哥
快递旺季遭遇雨雪天气 国家邮政局呼吁多理解和包容快递小哥 本报北京11月7日电(记者甘皙)国家...
-
高压、孤独,胆大、心细:手执焊枪的水下“蛙人”
高压、湿冷、孤独,胆大、心细、技艺高超—— 手执焊枪的水下“蛙人” 早上6时,伴随初升的朝...
-
掏粪掏了36年,他还在琢磨“新门道”
优化清掏路线、干活做到“三净”、总结技术诀窍,清掏工苏广林—— 掏粪掏了36年,他还在琢磨“...
-
内蒙古:二连浩特市新增1例本土确诊病例 额济纳旗累计治愈出院本土确诊病例76例
(抗击新冠肺炎)内蒙古:二连浩特市新增1例本土确诊病例 额济纳旗累计治愈出院本土确诊病例76例 ...
-
坚守在海拔4300多米的“天路保健医生”
中新网拉萨11月8日电(贡嘎来松)5日,青藏铁路格尔木至拉萨段达琼果站,海拔4327米。中铁十二局集团...
-
38年后,他终于知道了家在哪儿……
“我是谁,多大了,家在哪儿?”38年来,他总有这样一个心结被死死凝结,总为这样一句疑问而苦苦追...
-
受降雪影响 辽宁鞍山一农贸市场发生坍塌
8日早上6时左右,受连续强降雪影响,辽宁省鞍山市千山区大屯镇农贸市场发生坍塌,多台车辆被砸。 ...
-
中国舞蹈家协会顶尖教师巡回课堂(重庆站)举办
中新网北京11月8日电 (记者 高凯)由中国舞蹈家协会主办,中国文联舞蹈艺术中心、重庆市舞蹈家协会...
-
边城战“疫”:夜晚七点的暂停键
11月4日晚上7点,是中俄边境城市黑河一个再平凡不过的抗疫时刻。 如果在这一刻按下时间的暂停键...
-
风雪高原战“疫”长卷 寒潮下的西宁疫情防控观察
大风7级,大雪纷扬,最高气温只有-5℃! 这是青海省西宁市开启全城全员首轮核酸检测的天气。 ...
-
拟音师:“雕刻”声音的人【三百六十行】
三百六十行 拟音师:“雕刻”声音的人 闭上眼,90后赵洪泽有时甚至可以通过走路的声音,来判...
-
“双减”之后 中小学教师资格考试为何依然火爆
聚焦 “双减”之后,中小学教师资格考试为何依然火爆 近日,2021年下半年中小学教师资格考试(...
-
大数据助力贫困生成长
探索 大数据助力贫困生成长大数据画像能为贫困生成长带来什么 今年9月,云南省楚雄彝族自治州...
-
“大漠明珠”驶上发展快车道 塔里木盆地做足生态大文章
塔里木盆地做足生态大文章 “大漠明珠”驶上发展快车道 从塔里木盆地的西北角到西南角,和田...
-
职校生可报考事业单位 搬走职业教育的一块绊脚石
职校生可报考事业单位 搬走职业教育的一块绊脚石 “职业院校毕业生也可以报考事业单位了。”...
-
打算“双十一”买买买的姐妹 看完这篇再“剁手”
打算“双十一”买买买的姐妹 看完这篇再“剁手” 女性对于保养的热衷超乎想象,不少人只要是听...
-
完美“飞天”仰仗全宇宙最酷飞船试驾员
完美“飞天”仰仗全宇宙最酷飞船试驾员 11月7日,航天员翟志刚、航天员王亚平开展神舟十三号航天...
-
冠状病毒中损伤血管的蛋白首次确定
冠状病毒中损伤血管的蛋白首次确定 国际战“疫”行动 科技日报北京11月4日电 (记者刘霞)不少...
-
新电池结构让飞行汽车成为可能 相关技术将亮相北京冬奥
新电池结构让飞行汽车成为可能 相关技术将亮相北京冬奥会 科技冬奥进行时 搭载全气候电池...
-
H5N8病毒肆虐全球,我国家禽为何“独善其身”
H5N8病毒肆虐全球,我国家禽为何“独善其身” 科技日报哈尔滨11月7日电 (记者李丽云)记者11月7...
X 关闭
X 关闭





