解剖屎山,寻觅黄金之第二弹
大家好,我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啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于... -
今日快看!商洛中院破产审判工作新闻发布...
1 此次调整破产案件集中管辖及开展的破产审判业务“大调研、大练兵... -
为创作者而生丨松下新品S5M2X,S5M2固件...
LUMIXS5M2X正式发布1、支持两种RAW格式外录现在相机除了可以使用Pro... -
保企业就是保就业
日前召开的国务院常务会议指出,要进一步强化政策引导,在保持稳就... -
百家讲坛蒙曼长恨歌全集_百家讲坛蒙曼
1、蒙曼,中央民族大学历史系副教授、北京大学博士,主要研究领域为... -
日常生活的润泽之光——读长篇小说《凡...
作者:庄若江(江南大学江南文化研究中心主任)烟火凡尘,世事难料...
精彩放送
-
锦绣未央男主角是谁扮演的?锦绣未央结...
锦绣未央男主角是谁扮演的?电视剧《锦绣未央》的男主角是拓跋浚,饰... -
喜羊羊与灰太狼是哪国的动画片?喜羊羊...
喜羊羊与灰太狼是哪国的动画片?《喜羊羊与灰太狼》是中国的国产原创... -
中信建投:垃圾焚烧占比快速提升,新增...
【中信建投:垃圾焚烧占比快速提升,新增市场加速下沉】中信建投研... -
解剖屎山,寻觅黄金之第二弹
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于... -
高校学科专业迈向分类发展特色发展(深...
党的二十大报告提出,培养造就大批德才兼备的高素质人才,是国家和... -
职业本科成培育高技能人才新赛道 每日快讯
随着现代职业教育体系的建立,我国应用型人才培养体系已初步形成,... -
2022年平均工资出炉!IT业最高,房地产...
国家统计局9日发布2022年平均工资数据。无论是在城镇非私营单位还是... -
成都先导:5月9日融资买入1198.64万元,...
5月9日,成都先导(688222)融资买入1198 64万元,融资偿还1464 6... -
流光之城诗织的扮演者叫什么名字?流光...
流光之城诗织的扮演者叫什么名字?在电视剧《流光之城》中,桥本诗织... -
水利部开展海河流域防洪联合演练 每日头条
本报北京5月9日电(记者王浩)5月9日,水利部组织海河水利委员会及... -
全球观热点:秦刚:坚决反对单边制裁
新华社柏林5月9日电当地时间5月9日,国务委员兼外长秦刚在柏林同德... -
聂慎儿扮演者叫什么名字?美人心计慎儿...
聂慎儿扮演者叫什么名字?在电视剧《美人心计》中,幼年时期的聂慎儿... -
隔壁老杨:回不去了
最近晚上做梦时不时就会梦到学生时代虽已经是很遥远的事了还是让人... -
一生一世大结局是什么?一生一世任嘉伦...
一生一世大结局是什么?电视剧《一生一世》最后的结局中周生辰和时宜... -
全国铁路完成固定资产投资1674亿元 同...
记者从中国国家铁路集团有限公司获悉,1至4月,全国铁路完成固定资... -
环球滚动:工作量超负荷 员工称“干不完...
当公司分配的任务超过合理限度,员工表示任务不合理无法完成时,公... -
西游记哪一年拍的?西游记扫塔歌曲叫什么?
西游记哪一年拍的?电视剧《西游记》是于1982年开始拍摄,历时三年,... -
今日快看!商洛中院破产审判工作新闻发布...
1 此次调整破产案件集中管辖及开展的破产审判业务“大调研、大练兵... -
谁是凶手沈医生结局是什么?谁是凶手第...
谁是凶手沈医生结局是什么?电视剧《谁是凶手》中沈医生最终因为伪造... -
动态焦点:2022年平均工资出炉!IT业最高...
国家统计局9日发布2022年平均工资数据。无论是在城镇非私营单位还是... -
四海女主角是谁?电影四海在哪里拍摄的?
四海女主角是谁?2022年春节档电影《四海》的女主角是我国内地女演员... -
王杨:黄金起起伏伏,2038直接空!
黄金这两天行情不大就是震荡走势起起伏伏多空其实都有机会只是操作... -
抢钱俱乐部:黄金半夜偷袭珍珠港,又到...
没有人可以真的毁掉你的人生除非那个人是经过你授权的也等于是说你... -
300架737 MAX!波音收获欧洲廉价航空巨...
瑞安航空视觉中国资料图欧洲最大廉价航司瑞安航空订购300架波音737M... -
慕容冲被苻坚x了多久_苻坚怎么读 天天看热讯
1、百度百科显示的是pu,但根据字典读fu。2、苻姓由蒲更改而成。3、... -
为创作者而生丨松下新品S5M2X,S5M2固件...
LUMIXS5M2X正式发布1、支持两种RAW格式外录现在相机除了可以使用Pro... -
每日简讯:精密智造龙头厂商,持续推动...
第一时间提供各大券商研究所报告,最大程度减少个人投资者与机构之... -
曼哈顿距离和欧氏距离讲解_曼哈顿距离
1、曼哈顿距离--两点在南北方向上的距离加上在东西方向上的距离,即... -
保企业就是保就业
日前召开的国务院常务会议指出,要进一步强化政策引导,在保持稳就... -
环球热讯:凉菜是什么菜_凉菜介绍
欢迎观看本篇文章,小升来为大家解答以上问题。凉菜是什么菜,凉菜... -
谁敢娶?高铁被扇耳光女孩不是善茬,她...
女孩回头来说孩子把脚放下去,这引起了孩子家长的不快,提出了让女... -
机械化移栽率达100%!新疆玛纳斯番茄移...
眼下,正是新疆番茄移栽的关键时期。新疆玛纳斯县抢抓农时,利用新... -
【世界新视野】听香港霓虹灯招牌师讲灯...
中新社香港5月9日电题:听香港霓虹灯招牌师讲灯火阑珊下的城市往事... -
农业农村部部署华北东北三大流域禁渔期...
央视网消息:据农业农村部网站消息,5月16日12时,我国海河、辽河、... -
百家讲坛蒙曼长恨歌全集_百家讲坛蒙曼
1、蒙曼,中央民族大学历史系副教授、北京大学博士,主要研究领域为... -
服装、食品、饮用水......新一波“太空...
央视网消息:5月9日,天舟六号发射任务组织全区合练。目前,发射任... -
热资讯!三部门组织开展2023年“百场万...
新华社北京5月9日电(记者王聿昊、张辛欣)记者9日从工信部了解到,... -
原腾讯QQ空间负责人,T13专家,黄希彤被...
点击上方“码农突围”,马上关注这里是码农充电第一站,回复“666”... -
钉钉邮箱后缀是什么意思 钉钉邮箱后缀...
今天来聊聊关于钉钉邮箱后缀是什么意思,钉钉邮箱后缀是什么的文章... -
日常生活的润泽之光——读长篇小说《凡...
作者:庄若江(江南大学江南文化研究中心主任)烟火凡尘,世事难料... -
1mol氢氧化钠多少克_0 1mol l氢氧化钠...
1、假设配1L的氢氧化钠标准溶液 1 先准备好1升量瓶,烧杯,玻棒,... -
世界看热讯:西起九江不含能否去掉-西起...
1、不能。2、括号作为解释说明的标点符号,对前面的语句进行附加说... -
每日消息!安全生产曝光台(九)
1 慈利县泡沫酒馆被挂牌督办!近日,慈利县消防救援大队发现位于零... -
实时焦点:描写人物外貌的句子_描写美女...
1、人物外貌描写要注意抓住人物的外貌特点,加以重点突出,不需要面... -
孕妇能喝红牛吗晚期_孕妇能喝红牛吗 当...
孕妇不能喝红牛。红牛饮料是一种功能性饮料,具有提神醒脑、补充体... -
万丰股份境外贡献三成收入却称超七成产...
《金证研》南方资本中心羲和 作者正则 风控回溯历史,2005年,只... -
向日葵花语是什么_向日葵的花语 速讯
1、向日葵的花语是信仰、荣耀、骄傲、忠诚和钦佩。向日葵的含义是默... -
天天观热点:唐代陕西地区文化交流的渠...
引言在唐代,陕西地区是经济繁荣、文化交流频繁的区域,商业活动的... -
22条河流发生超警以上洪水 各方积极应...
新华社北京5月9日电(记者刘诗平、姚子云)水利部9日消息,自5月5日... -
【速看料】不得涉及诊疗方法、不得利用...
为保障消费者的合法权益不受侵害,2023年第一季度,北京市广告与网... -
一季度我国旅行服务进出口同比增长56.6%...
新华社北京5月9日电(记者谢希瑶)今年一季度,我国旅行服务明显恢... -
林良铭:开场不够兴奋,大连人创造了机...
直播吧5月9日讯中超第6轮比赛,大连人主场1-1战平沧州雄狮。赛后,... -
环球快资讯:秀我中国 | 新时代中国乡...
一个国际品牌上的神秘图案吸引了美国专家“老谭”的注意图案很特别... -
输入法图标不见了win10_输入法图标不见了
在使用电脑的过程中,输入法经常像和人捉迷藏一样消失。对于一些不... -
天天速看:异地医保在北京门诊能报销吗...
异地医保在北京门诊能报销吗?答:可以,外地参保人员来京就医,按... -
襄垣农商行乡村振兴事业部召开贷款投放...
黄河新闻网长治讯:近日,襄垣农商银行乡村振兴事业部组织召开5月份... -
哈尔滨市物业管理协会:物业要书面告知...
近日,哈尔滨一栋居民楼的承重墙被砸楼体受损的事件引发广泛关注。5... -
CPI风暴恐冲击全球市场!FXTM:美元、英...
周二5月9日欧市盘中市场在关键的美国通胀数据前保持谨慎美元受困于... -
【独家焦点】王导:黄金2029直接空,坚...
黄金正好被4小时中轨压制这是绝佳的放空点位再坚持一次现在2029直接... -
视点!仅踢45分钟,谢晖不满嫡系,大连...
仅踢45分钟,谢晖不满嫡系,大连人2将昙花一现没状态+被踢回原形大... -
万锦晟5.9美盘黄金走势分析,黄金震荡上...
黄金上周五大跌之后昨日没能延续跌势这个走势在我的预期之中周末的... -
环球热讯:陈阿牛:黄金31-32做空;短线...
生命的意义自己不去探索没人替你探索生命的谜团自己不去廓清没人替... -
世界观天下!离婚前张丹峰称自己没吃软...
简介为什么要吃软饭?我靠努力工作挣钱养家糊口。吃软饭是什么意思... -
当前快播:20万的中大型SUV有多值得买?...
如果一个字总结2023年上市的新车,那一定是“卷”。大家一边高喊“... -
美意延年,国色胶香 爱健康,爱生活,...
真材实料阿胶糕,补血养颜就选它在很多人的印象中,阿胶的作用只有... -
2022年度秋粮收购总量达近三年最高水平
央视网消息(新闻联播):国家粮食和物资储备局最新发布,截至4月底... -
1至4月全国铁路完成固定资产投资1674亿元
央视网消息(新闻联播):国铁集团今天(5月9日)发布的数据显示,1... -
天津河西海关“云签发”首份出境伴侣动...
5月8日,天津河西海关通过“海关属地查检系统暨检验检疫证书‘云签... -
当前速递!天舟六号货运飞船发射前全区...
央视网消息:据中国载人航天工程办公室消息,天舟六号货运飞船计划... -
环球讯息:监管部门出手规范房地产经纪...
央视网消息:昨天(5月8日),住房和城乡建设部、国家市场监督管理... -
易极:5.9原油区间震荡,闭眼收米!
原油4小时结构原油4小时经过这两天的震荡上涨打开了上方732752的上... -
国信期货20230509日评:原油企稳反弹,...
讯——原油美国�退预期缓解油价企稳反弹周二国内原油价格小幅震荡... -
【全球时快讯】图灵波浪5.9晚-黄金遇重...
图灵波浪59晚黄金遇重要分水岭多看少动黄金黄金今天一天都在震荡之... -
焦点速讯:今年春耕期间我国化肥市场供...
央视网消息:记者从全国供销合作总社了解到,目前,春耕用肥接近尾... -
广信材料接待国泰租赁等多家机构调研
广信材料接待国泰租赁等多家机构调研 -
焦点关注:方萍萍:压力位已经到达冲高...
通过对黄金小时图解析得知黄金从早盘到现在一直向上反弹运行目前已... -
现货黄金操作建议2023-05-09
现货黄金市场行情现状简述昨日的黄金价格整体波动范围并不大主要处... -
当前时讯:以歌会友以歌传情 中国民歌...
央视网消息:农历三月十五至二十二是云南大理“三月街民族节”,今... -
湖北宜昌:“闺女”“媳妇”为家园代言...
宜昌籍舞蹈家邰丽华用手语推介家园。 刘康 摄中新网宜昌5月9日电(... -
为什么Python被称为“胶水语言”?它的...
为什么Python被称为“胶水语言”?它的特点有哪些?Python是一种高... -
每日观点:蓝花楹唯美盛开 “赏花经济...
央视网消息:“五一”假期过后,各地为了延续假期的火爆消费势头,... -
揭秘基金从业资格考试“0复习保过”培训...
新华社上海5月9日电题:揭秘基金从业资格考试“0复习保过”培训套路... -
秦岭大熊猫研究中心破解大熊猫繁育难题...
央视网消息:2022年,秦岭大熊猫研究中心繁殖4胎6仔,种群增幅历年... -
播种在希望的田野上——东北黑土地耕作...
现代化农机播下丰收的希望、可持续耕作催生更多优质粮、多形态惠民... -
商务部:一季度我国服务贸易进出口总额1...
央视网消息:据商务部网站,商务部服贸司负责人介绍2023年一季度服... -
如何打造世界级旅游目的地?专家学者广...
当前,旅游业正处在疫后恢复与振兴的重要战略机遇期,如何推动旅游... -
环球播报:外交部发言人:奉劝加拿大方面...
新华社北京5月9日电(记者曹嘉玥、成欣)针对加拿大政府宣布中国驻... -
晨丰科技:公司控股股东和实控人将变为...
晨丰科技:公司控股股东和实控人将变为丁闵 -
重度办公人福音 华为首款13代酷睿i9大...
华为公司一直以来致力于全场景生态战略,打造全场景智慧体验。因此... -
黑人牙膏广告2021_搜黑人牙膏广告背景音乐
1、超多人在找这首广告曲现在还没有一个正式的歌名,只知道主唱是冯... -
头条:上海婚假在领证后多久有效_上海婚假
1、原晚婚奖励7天婚假,现在统一10天婚假。2、原晚育护理假3天,现... -
第20届东博会招商组展推进 多国恢复包...
(黄令妍)第20届中国—东盟博览会(以下简称东博会)高官会9日在广西南... -
【4.26专题•北知法院】“法护创新 亦...
来源:知产北京“北京知识产权法院经开区法官工作站”揭牌仪式日前... -
【防弹少年团/闵玧其】花样年华 THE N...
玧其22年6月23日关上聊天窗口,我抬头看着天花板。灵魂的地图,硕珍... -
世界热点评!杨红樱作品好词好句好段_关...
1、《杨红樱作品好词好句好段》是2007年作家出版社出版的图书,作者... -
郑氏点银:黄金2030为节点压力,原油73....
郑氏点银黄金2030为节点压力原油735拐点压制回顾昨日行情走势及出现... -
当前快讯:五部门:7月1日起全国范围全面...
中新网5月9日电据生态环境部网站消息,生态环境部、工业和信息化部... -
2022年全国城镇单位就业人员工资水平保...
新华社北京5月9日电(记者魏玉坤)国家统计局9日发布数据显示,2022... -
北流新丰镇健乐幼儿园_北流市新丰镇欢乐...
1、北流市新丰镇欢乐童年幼儿园,是一家民办幼儿园。2、。本文到此... -
必抢价!16G马甲内存155元
想要更畅爽的体验,你应该配更大的内存,16G内存好价来袭,组建64G...