观察:解剖屎山,寻觅黄金之第二弹
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。aust
2023-05-30大家好,我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
2023-05-30
鞭牛士5月30日消息,据新浪财经消息,格力电器董事长董明珠接受专访时表示:“前段时间网上说我们手机不...
2023-05-30
今年第2号台风“玛娃”来势汹汹,为全力应对台风可能造成的影响,国能晋江热电公司提前部署、周密组织、...
2023-05-30
“科学是一种精神,是一种追求真理和探索未知的精神。愿你们在科学的道路上保持初心,不断学习、实践和...
2023-05-30
2023年5月30日,中泰证券(600918 SH)首次公开发行限售股上市流通公告,本次限售股上市流通数量为13 64亿股
2023-05-30
今天小编岚岚来为大家解答以上的问题。圆通和韵达哪个快递好一点,圆通和韵达哪个快相信很多小伙伴还不知道
2023-05-30
百世集团发布2022企业社会责任报告数智化运营驱动绿色物流发展---
2023-05-30
来为大家解答以上问题,win7系统版本区别,windows7版本区别很多人还不知道,现在让我们一起来看看吧!1、
2023-05-30
想必现在有很多小伙伴对于七手八脚仿写人体部位的成语方面的知识都比较想要了解,那么今天小好小编就为大家
2023-05-30
音频解说1、董兆熊(1806-1858),清代文学家。字敦临,一字梦兰,苏州吴江人,咸丰初年举孝廉方正。诸生,
2023-05-30
5月29日,上海烈日炎炎,国家会展中心内参展商和参观者火热互动。当日,2023上海旅游产业博览会二期正式在
2023-05-30
来为大家解答以上问题,索爱z1i刷机,索爱官网刷机很多人还不知道,现在让我们一起来看看吧!1、不过2012年
2023-05-30
异域风情的舞曲,节奏丝滑到位的舞蹈,加上自带夏日清凉感的薄荷音,将多元魅力汇集一身,就是5月实力唱跳
2023-05-30
在此基础上,华为MateX3将全新的研究成果、自研材料和专利技术集于一身,不仅做到了直板机级别的极致轻薄体
2023-05-30
每日小编都会为大家带来一些知识类的文章,那么为大家带来的是加纳乌拉圭预测方面的消息知识,那么如果各位
2023-05-30
详解绿军连两年丢冠该咋办:换帅+拆双探花组合四大调整可再冲冠,湖人,哈登,绿军,双探花,热火队,波士顿凯尔
2023-05-30
生态新城,关于生态新城介绍这个很多人还不知道,我们一起来看看!1、生态新城坐落于有着“中国大蒜之乡...
2023-05-30
国家文物局5月30日举行“考古中国”重大项目重要进展工作会,通报了陕西清涧寨沟遗址等一批商代考古发现...
2023-05-30
5月29日下午,第三届全国戏曲(南方片)会演参演剧目——赣南采茶戏《一个人的长征》媒体见面会在湖北戏...
2023-05-30
项目名称:基础零部件疲劳试验机(液压伺服疲劳试验机)项目编号:0618-234TC230F04A招标范围:基础零部件疲
2023-05-30
NBA东部决赛抢七大战,凯尔特人主场84-103不敌热火,总比分3-4结束了本赛季的征程。赛后,绿军主帅马祖拉接
2023-05-30
来自德国媒体《图片报》的最新报道,皇马今年夏窗签下贝林厄姆是大概率的事情,但皇马仍在与多特砍价还价,
2023-05-30
分为普通的百万医疗险、百万防癌医疗险和普惠型百万医疗险。普通的百万医疗险可以报销因疾病或意外导致的门
2023-05-30
为全面贯彻党的二十大以及中央经济工作会议关于“统筹发展和安全,压实金融风险处置各方责任,积极稳妥...
2023-05-30
水井坊:许勇申请辞去副总经理职务
2023-05-30
恩佐、大马丁等阿根廷队友、120位嘉宾出席,据意大利媒体报道,阿根廷队队长梅西和妻子安东内拉也受邀参加
2023-05-30
5月29日,立昂微(605358)融资买入2115 57万元,融资偿还2866 78万元,融资净卖出751 21万元,融资余额9 93亿元。
2023-05-30
上证报中国证券网讯(记者宋薇萍)记者5月30日从新开发银行获悉,新开发银行(NDB)昨日在中国银行间债券市
2023-05-30
来为大家解答以上问题。bias指标使用技巧视频,Bias指标使用技巧是哪些这个很多人还不清楚,现在一起跟着来
2023-05-30
大家好,小乐来为大家解答以上的问题。汽车车船税收费标准这个很多人还不知道,现在让我们一起来看看吧!1、
2023-05-30
1、360安全卫士同优化大师、鲁大师这是两个类别的软件。2、360安全卫士上网必备安全软件。3、360安全卫士它
2023-05-30
5月29日,光大优势配置混合A最新单位净值为0 7199元,累计净值为1 1791元,较前一交易日下跌0 54%。历史数
2023-05-30
小常来为大家解答以上问题。手机数据线接口类型名称,手机数据线接口类型很多人还不知道,现在让我们一起来
2023-05-30
1、呱呱泡蛙16级进化为ゲコガシラ,后者则在36级进化为甲贺忍蛙火狐狸进化为テールナー,然后妖火红狐哈力
2023-05-30
制作:陈泉伊岳小乔杨丽娟韩文鋆皇甫凌雨成进羽鸣谢:中国运载火箭技术研究院审核:董佳莹、钱航、陈牧野、
2023-05-30
封面新闻记者罗石芊图据网友5月29日,封面新闻记者从凉山州消防救援支队获悉,当天17时48分,凉山州消防救
2023-05-30
5月29日,光大安泽债券A最新单位净值为1 1184元,累计净值为1 2414元,较前一交易日上涨0 04%。历史数据显
2023-05-30
1、17集齐齐一觉醒来,她发现自己睡在薛洋的车里,下车后她看到了日出的情景,薛洋下车后吻了齐齐,并说爱
2023-05-30
5月25日,市委常委、统战部部长温奇志带队到南江县督导调研基层统战实践创新工作。市委统战部副部长、民宗
2023-05-30
1、秋天常见病和多发病有:秋燥症秋季雨少天干,空气中缺乏水分的滋润,人易出现鼻咽干燥、声音嘶哑、干咳
2023-05-29
5月29日,在与数位香港银行家展开阿联酋的访问之旅之时,香港金融管理局总裁余伟文发表题为:“广交朋友...
2023-05-29
近日,重庆市武隆区公安局交巡警支队组织辖区客货运企业负责人召开线索征集座谈会,会议由支队政委向浪主持
2023-05-29
200克。1、饼皮其实就是春饼皮的做法。面粉先用适量开水依次添加搅成团状,然后再酌量添加冷水把面团和成一
2023-05-29
国家发改委:扩大股权和债权融资规模以市场化改革推动加快水网工程建设国家发改委近日表示,将继续按照市场
2023-05-29
专家表示,这些年我国高端制造业数字化、智能化转型的趋势越来越显著,部分企业已具备一定的技术、设备基础
2023-05-29
吉林高三学生郑春梅至今已失踪6个多月。5月29日中午,她的父亲郑云江发文称,女儿的遗体于27日被找到。随即
2023-05-29
成都高新区印悦府(翠园)1、2、5栋人才公寓项目选房公告根据《成都市人才公寓租售管理办法》(成住建〔202
2023-05-29
上海市是中央机构确定的超大城市,根据中国人口普查分县资料,上海市的城区人口已经超过了1900多万人。当然
2023-05-29
相信目前很多小伙伴对于舞力对决都比较感兴趣,那么小搜今天在网上也是收集了一些与舞力对决相关的信息来分
2023-05-29
鞠婧祎的一组美图曝光,她身穿吊带黄裙露出纤细美腿,将长发扎成单侧麻花辫甜美可人,整个人又纯又欲
2023-05-29
位于虹口区中部偏东。东起大连路,西傍沙泾港,南至周家嘴路,向西沿安国路、飞虹支路、虹镇老街三角地段,
2023-05-29
如果你享受电动助力车的高灵活性和便捷性,但又不愿意使用市面上造型单调的传统电动摩托车,那么英格威即将
2023-05-29
1、武汉广场对面。2、解放大道中山公园旁边湖北省武汉市武昌区公正路省广电中心。本文到此分享完毕,希望对
2023-05-29
手机号码在现代社会中扮演着重要的沟通工具,然而在中国文化中,手机号码的尾数也具有吉凶寓意。特定的手机
2023-05-29
货车上泡沫起火顷刻吞没全车警醒:车上需常备灭火器
2023-05-29
5月26日,蜂助手(301382)融资买入4235 92万元,融资偿还3927 43万元,融资净买入308 49万元,融资余额7528 89万元。
2023-05-29
1、yyds“永远滴神”,也可以翻译成永远单身,英语倒数等。2、2、yyds这个梗,源自于山泥若的直播间。3...
2023-05-29
风险偏好重回全球市场,亚股开盘走高,日经225指数涨幅一度扩大至2%,澳大利亚S&P ASX200指数涨幅扩大至1%
2023-05-29
5月19日,奥迪S4Avant正式于中国市场上市,指导价52 18万元。作为奥迪S家族的又一重磅成员,奥迪S4Avant搭
2023-05-29
1、重汽有好多。2、在哪里买的在哪里问。3、建议查询使用说明书。本文到此分享完毕,希望对大家有所帮助。
2023-05-29
今天来聊聊关于维普数据库官网,维普数据库的文章,现在就为大家来简单介绍下维普数据库官网,维普数据库,
2023-05-29
夏季就要来了,又到了蚊子肆虐的时节。小米有品上架了一款俏蜻蜓暗夜捕手灭蚊灯PRO,三重控蚊,普通款119元
2023-05-29
严浩翔为什么缺席极限挑战严浩翔缺席《极限挑战》是因为他要准备即将到来的演唱会,演唱会比录制综艺要重要
2023-05-29
1、是的。2、只要在改装时不改变汽车的型号、发动机型号、车架号,不破坏车身结构。3、其他改色、更换零部
2023-05-29
1、超人高校SkyHigh(2005)导演:迈克·米歇尔编剧:MarkMcCorkle PaulHer
2023-05-29
《心灵杀手2》是刚刚过去的PlayStation发布会上画质最精美的游戏之一。Remedy发布了《心灵杀手2》的新截图(
2023-05-28
“长风6号”战鼓响雷霆万钧护平安作为英雄城的公安警队南昌公安以更加坚决的态度更加饱满的热情、更加严...
2023-05-28
新媒体迅速兴起,吸引了大量网友参与互动,不少犯罪分子也混迹其中,利用平台实施诈骗。近日,广西崇左江州
2023-05-28
今天,NBA季后赛东决G6,凯尔特人104-103战胜热火,大比分打成3-3平。此役,怀特完成了绝杀。赛后,杰伦-布
2023-05-28
邓超是哪里人,邓超出生地介绍很多人还不知道,现在让我们一起来看看吧!1、邓超出生地:江西省南昌市。2、
2023-05-28
科技创新是提升国家核心竞争力的必由之路。以科技创新为引领,把实现科技自立自强作为国家发展的战略支撑,
2023-05-28
当地时间5月27日,詹妮弗·盖茨在社交媒体上分享了一张美照,呈现出了与以往很是不同的风格,真是够罕见的
2023-05-28
今天来聊聊关于企多维网站,企多维的文章,现在就为大家来简单介绍下企多维网站,企多维,希望对各位小伙伴
2023-05-28
1、国内第一种:69宁波大学59 93696711433浙4综合15第二种:77宁波大学7
2023-05-28
5月28日,记者获悉,又是一年毕业季,眼下正是应届毕业生求职就业的高峰期,为了帮助高校毕业生实现就业、
2023-05-28
小马来为大家解答以上问题。3岁宝宝营养食谱,三岁宝宝营养餐很多人还不知道,现在让我们一起来看看吧!1、
2023-05-28
今年以来,各类体育赛事活动十分活跃。据《2023中国田径协会路跑工作报告》显示,今年上半年全国备案路跑赛
2023-05-28
Datawhale干货作者:平凡@知乎,诺桑比亚大学,在读博士今天晚上,花了一点儿时间看了两篇文章:《Emergent
2023-05-28
余干县气象台2023年05月27日18时14分变更雷电黄色预警信号:预计未来6小时内,康山垦总场、康山乡、瑞洪镇
2023-05-28
甘肃省非遗保护协会到访崆峒区5月25日下午,甘肃省非遗保护协会一行7人来我区开展了音乐类非遗项目数据库录
2023-05-28
1、将金针菇去除根部。2、分成若干小份。3、清洗干净,控干水分。4、加少许水,搅拌成糊状。5、金针菇放入
2023-05-28
[emailprotected]offecho正在清除系统垃圾文件,请稍等 del f s q
2023-05-28
今天来聊聊关于韩坤在哪个网校,韩坤的文章,现在就为大家来简单介绍下韩坤在哪个网校,韩坤,希望对各位小
2023-05-28
勒布朗-詹姆斯在接受ESPN访问时谈到健康的自己比现役联盟90%的球员强,也许比联盟95%的球员都强。随后杨毅
2023-05-28
1、科比:周杰伦,你知道怎么打篮球吗?2、杰伊:哼,当然!3、曲:周杰伦 词33604、天地都是因为一场胜败
2023-05-27
话剧《苏东坡》来到上海,这背后有哪些全新的尝试和努力?未来又要做哪些提升?记者实地探访剧组,记录这场
2023-05-27
1、选中内容下标:“Ctrl”“=”选中内容上标:“Ctrl”“shift”“=”这两个都是0、1切换键。2、就是说
2023-05-27
1、首先打开手机解锁,在手机桌面找到并点击设置功能。2、进入设置界面后,您可以根据个人需要点击无线局域
2023-05-27
我们想要开一个京东店铺,那也需要清楚入驻京东大概需要多久的时间,同时还需要满足哪些条件。那么京东店
2023-05-27
各位考生:现将2023年青海省六一幼儿园面向社会公开招聘教师进入现场资格审核人员名单(见附件2)公布,请进
2023-05-27
今天来聊聊关于如何找到被家长藏起来的平板,平板被家长藏起来了怎么找的文章,现在就为大家来简单介绍下如
2023-05-27
今天大家应该都在关注女子全款给儿子买套房不料竟成亲家晚年的归宿自己竟成了客人这件事,那么很多小伙伴在
2023-05-27
2023年江西师范大学在职mba学费为20000元 年,学制3年,学费共计60000元。江西师范大学在职mba学习方式为在
2023-05-27
横州市气象台27日12时5分发布雷电黄色预警信号:目前雷雨云团正逐渐靠近横州市南乡、新福等乡镇,预计未来6
2023-05-27
人民币对美元汇率5月26日先跌后涨,在在岸和离岸市场日内反弹一度均超过350点。5月26日,人民币对美元即期
2023-05-27
针锋相对txt无删减,针锋相对txt这个很多人还不知道,现在让我们一起来看看吧!1、你好,我是大鱼儿不吐泡泡
2023-05-27
证券时报记者贺觉渊因不实信息传播引发的昆明城投风波连日来持续发酵,再度触动市场对我国地方城投债务风险
2023-05-27
5月24日,松江区人大常委会副主任吴建良一行至区生态环境局开展调研座谈。区人大常委会城建环保工委主任黄
2023-05-27
河北大城县人民政府在其官方网站发布《情况通报》:2023年5月26日16时许,大城县臧屯派出所民警在对涉嫌非
2023-05-27
青海新闻网·大美青海客户端讯5月26日,记者从省政府新闻办举行的2023年推动医保高质量发展新闻发布会上了
2023-05-27Copyright © 2015-2023 港澳水产网版权所有 备案号:京ICP备2023022245号-31 联系邮箱:435 226 40 @qq.com