解剖屎山,寻觅黄金之第二弹
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。aust
2023-05-29大家好,我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啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。aust
2023-05-29原料:较大个的鸡腿3个,盐焗鸡粉40克,生姜1大块,香葱1把,花生油少许,辣椒油2汤匙,白芝麻1汤匙。准备
2023-05-29昨天,“黄奕未经允许私拿美术馆展品摆拍”热搜第一。有消息称,女明星黄奕未经允许拿美术馆展品拍照,...
2023-05-29“数”造产业发展新动能
2023-05-29为贯彻落实普法宣传教育,让法治精神更加深入人心,让普法活动更鲜活、更生动、更“走心”,近日,西翥...
2023-05-29全国大学生心理健康日,大学生心理健康成热议话题高校应如何呵护学生心理健康?5月25日是全国大学生心理健
2023-05-291、百度搜索“多乐市场”进入;2、然后就可以看到下图中的内容,我们点击免费下载:3、选择下载目录,这...
2023-05-291、雷速登闪电冲线》 以凌风、凌云两兄弟为故事核心,加上众多的朋友角色和对手角色倾力演出,虽然是一
2023-05-29今天来聊聊关于万佛山风景区联系电话,万佛山风景区的文章,现在就为大家来简单介绍下万佛山风景区联系电话
2023-05-29来为大家解答以下的问题,庄杏花谷,峨庄这个很多人还不知道,现在让我们一起来看看吧!1、踏青去峨庄清明小
2023-05-28①东南网架:与万华物资签订10 74亿元采购框架合同;②潍柴动力:纯电动、混动及燃料电池相关产品已经
2023-05-28新华社贵阳5月28日电(记者骆飞)28日,在贵州省贵阳市举行的2023中国国际大数据产业博览会落下帷幕。本届
2023-05-28解答:1、我觉得刺绣比麂皮发泡好。本文到此结束,希望对大家有所帮助。
2023-05-28罗马诺:皇马准备下周敲定贝林厄姆转会,转会费1亿欧+奖金,多特,皇马,罗马诺,贝林厄姆,美因茨队,皇家马德里
2023-05-281、严长明《秦云撷英小谱》、吴长元《燕兰小谱》、周元鼎《影戏论》,都是较有影响的论述秦腔著作。2、秦腔
2023-05-28【万兴科技吴太兵:AIGC将呈现三大新趋势所有软件都需要再做一遍】近日,万兴科技(300624)董事长吴太兵表示
2023-05-281、病情分析:现在产后满月出汗已经成为很多商家推广的一种产后保健方式。2、很多人认为第二个月容易得月子
2023-05-281、直接在Win10任务栏的搜索框种搜索 "事件查看器”,就可以快速找到了,然后点击最顶部的“时间查看器...
2023-05-28养老金(pension)也称退休金、退休费,是一种最主要的社会养老保险待遇。简单说,个人养老金就是存一笔钱,
2023-05-28为进一步深化“泰惠农·金融服务乡村振兴”活动成果,发挥政策性农担为农担保职能,为新型农业经营主体...
2023-05-281、C15,C20,是指混凝土强度等级。2、在建筑结构设计规范上面,和桥梁设计规范上面可以查到。本文到此分享
2023-05-28今年以来,外汇局山西省分局切实提高跨境金融服务平台场景影响力,结合我省外经贸企业生产经营实际,探索出
2023-05-28据英国《新科学家》杂志网站22日报道,弓头鲸是世界上寿命最长的哺乳动物,很少受癌症的影响。美国科学家在
2023-05-28中国田径协会消息,2023年全国田径大奖赛第三站浙江台州站27日进入第二个比赛日的争夺,女子铅球奥运冠军巩
2023-05-28属龙人快看过来,如果你是这几个月份出生的,那你一生都会幸福美满。相遇就是缘,动动您发财的小手点个赞,
2023-05-281、一字繁体:一拼音:yī释义:另外的:蟋蟀一名促织。2、2、表示动作短暂,或是一次,或具试探性:算一算
2023-05-28今天来聊聊关于泰安英雄山中学初中部官网,泰安英雄山中学初中部的文章,现在就为大家来简单介绍下泰安英雄
2023-05-28长江网讯(记者王允祺通讯员郑璐张睿婕)精致的明信片,刻有学校标志性建筑的印章,古朴素雅的书签、罗...
2023-05-28欢迎观看本篇文章,小柴来为大家解答以上问题。腌鱼的做法和配方窍门,腌鱼的制作方法很多人还不知道,现在
2023-05-28掐指一算,北京BJ40(图片|配置|询价)自2014年上市至今已过去近8年,在进行过中期改款之后,也到了需要换代
2023-05-27中新网北京5月27日电 (记者 陈杭)“2023水立方青少年游泳公开赛”27日在北京国家游泳中心奥林匹克比赛
2023-05-271、这个不值钱。2、多数是骗子以他作为美元。3、忽悠哪些兑美元不熟悉的人。本文到此分享完毕,希望对你有
2023-05-271、看情况吧。2、多的话按照单个。3、少的话按照打样我这里是这样子的。本文到此分享完毕,希望对大家有所
2023-05-27【ITBEAR科技资讯】5月27日消息,屏幕供应链咨询公司DSCC的首席执行官罗斯·杨近日透露,三星即将推出的Gal
2023-05-271、病情分析:您好,胸型大小形状与遗传因素、营养、个人体质都有关系,所以存在差异是正常的,并且你处在
2023-05-27《天津市文明行为促进条例》宣传月活动持续升温推动社会文明程度整体提升,
2023-05-27作者丨楷楷编辑丨月见近日,有媒体爆料称网红零食门店“a1零食研究所”关闭了80%的线下门店,对于消费者...
2023-05-272023年4月以来,银行理财规模快速增长约1 5万亿,多由理财公司贡献,似乎走出了“赎回潮”的阴霾。但在...
2023-05-27于NBA之上,历史第一的争论话题永远都在,而所围绕的无疑是两位球员,其一是乔丹,再者为詹姆斯!因后者尚未
2023-05-27日前,昆明铁道职业技术学院与昆明经开区(自贸试验区昆明片区)举行合作框架协议签约仪式。
2023-05-271、微信发10分钟视频的方法: 首先打开手机微信,找一个联系人,点击右下角的“+”号。2、 ...
2023-05-27中国手机市场连续5个季度暴跌越来越多手机卖不动!为啥年轻人不换新手机了?
2023-05-27中新网5月27日电27日,河北省廊坊市大城县人民政府在官网发布情况通报指出,2023年5月26日16时许,大城县臧
2023-05-272023执业药师《中药一》精选试题及答案(4)由执业药师考试栏目提供,查找更多2023执业药师《中药一》精选试
2023-05-27连日来,位于齐齐哈尔市建华区中华路中段北侧的齐齐哈尔市首个市级志愿服务主题广场正在紧张施工,预计6月
2023-05-27在行业人士看来,无论是周杰伦还是头部主播背书,都未能解决蕉下重营销轻研发的痛点,泡沫过后,未来如何用
2023-05-27睡觉做梦要考虑很多条件:1 入睡困难,梦多伴有烦躁不安,头痛,头胀,便秘,小便黄,胸胁胀满,舌红,苔黄
2023-05-271、译文:“君子安静坦然而不傲慢无理,小人傲慢无理而不安静坦然。2、”君子没有傲气,但是有傲骨。3、...
2023-05-27来为大家解答以下的问题,了么骑手兼职需要培训吗,饿了么骑手兼职这个很多人还不知道,现在让我们一起来看
2023-05-275月26日,金证股份今日跌7 82%,龙虎榜数据显示,上榜营业部席位全天成交3 9亿元,占当日总成交金额比例为2
2023-05-275月26日,山东东明石化集团硫磺报价,固体硫磺报价在810元 吨,液体硫磺价格在740元 吨,5月16日企业调价,
2023-05-27郑商所公告,一、自2023年5月30日结算时起,白糖期货2309合约的交易保证金标准调整为12%;白糖期货2311合约
2023-05-27GPS定位“神器”有违初衷令人不寒而栗定位器市场定位错了记者调查发现,如今,各种外形的GPS定位“神器...
2023-05-271、衡水一中是河北教学最好的,不过很严。2、很好啊管理很严格也很出成绩的对小孩子不好,把孩子们的天真给
2023-05-265月26日(农历4月初八)是岚县一年一度的白龙山庙会活动,四面八方赶来做生意的商贩和赶庙的群众络绎不绝,
2023-05-265月25日,德国女足国家队宣布GooglePixel成为其新的官方合作伙伴,Google和德国足协(DFB)将建立为期三年
2023-05-26今天结束的NBA季后赛东决G5中,凯尔特人110-97击败热火,将大比分扳成2-3。据统计,历史上系列赛3-0领先的
2023-05-261、已发送到你的私信里面,注意查看网页右上角红色消息动态~收到后记得采纳回答【认准发信人ID,别采纳错了
2023-05-26安康市还明确,除政策性引进的高层次人才以外,机关公务员(含参照公务员管理事业单位工作人员)岗位,一律
2023-05-262010年,因独生女意外去世,60岁的盛海琳决定冒险进行试管婴儿手术,成功生下一对双胞胎女儿,打破“生...
2023-05-26StartDT(奇点云、GrowingIO)举办年度发布会,发布数据云7大场景,新增云数仓产品及智能制造数字化转型场
2023-05-26近期,用户期盼已久的vivoS17系列即将发布。现在许多年轻人对手机外观设计与影像表现有更高追求,vivoS系列
2023-05-26南方财经5月26日电,5月26日,中特估概念午前企稳,中国移动升近3%,交通银行、建设银行、农业银行、工商银
2023-05-26先点击自己QQ上的QQ会员图标!然后再点击出来的QQ会员官网!就行啦!还可以在百度输上www v
2023-05-261、1 单击注册2、2 在下面的图片中填写有效的电子邮件地址,点击第一个以表明你是新来的,然后点击黄色按钮
2023-05-261、根据石家庄防疫要求,现在所有在石家庄市的人员和车辆都不得离开石家庄市,藁城区的人不得离开藁城区。2
2023-05-26中国天气网讯昨天(5月25日),广东大部地区的雨水基本停歇,未来几天当地将转为受副热带高压脊控制,天气
2023-05-265月24日,安徽合肥。一名2岁女童吃糖果时不慎卡喉,呼吸困难,孩子的爷爷心急如焚 此时,合肥市公安局瑶
2023-05-26这是【木曜日のパーティー】在23年5月9日发布的一款日式RPG游戏。供奉着乡下女性之神的宝罗神社的巫女[神菜
2023-05-26以下是胜通能源在北京时间5月26日09:36分盘口异动快照:5月26日,胜通能源盘中加速下跌,5分钟内跌幅超过2%
2023-05-26生命源氨基酸口服液,关于生命源氨基酸口服液介绍这个很多人还不知道,我们一起来看看!1、生命源达能复合氨
2023-05-261、在EXCEL中,使用照相功能进行处理,非常的方便。2、 "会议座签的制作方法:在A3输入座签,A1使用照相机
2023-05-26曾互赠商标上演车企“一家亲”的长城汽车和比亚迪汽车“掀桌翻脸”。5月25日,距离宋ProDM-i冠军版上市...
2023-05-265月25日,中庚价值灵动灵活配置混合最新单位净值为2 1094元,累计净值为2 1094元,较前一交易日下跌0 65%。
2023-05-261、是导师考核吧!南马子呷,李蔓唱的,你的眼神。2、盲选的时候为了让南马子呷进队,齐秦清唱了姐姐的橄榄
2023-05-26相信目前很多小伙伴对于怎样系红领巾都比较感兴趣,那么小搜今天在网上也是收集了一些与怎样系红领巾相关的
2023-05-26【开市客:三季度总营收536 5亿美元分析师预期546 6亿美元】开市客三季度每股收益2 93美元,分析师预期3 30
2023-05-261、舌根疼痛分为以下两种情况:一是外感风寒,用于治疗风寒,方剂,防风,甘草,桔梗,荆芥,阿莎丽,麻黄
2023-05-26来为大家解答以上的问题。沈珂珂×堂堂,沈珂这个很多人还不知道,现在让我们一起来看看吧!1、沈珂,男,汉
2023-05-26现在不少人希望自己在退休之后能够享受美好的养老生活,那么养老规划就要尽早启动,大家可以看看商业养老保
2023-05-261、《泰坦尼克号》的女主角是凯特温斯莱特。2、凯特温斯莱特(KateWinslet),1975年10月5日出生于英国伯克郡
2023-05-26据解放日报,如今,在新浪微博上已经搜索不到“徐晓峰在上海”,但就在两年前,这还是一个有着400多万粉...
2023-05-26新京报讯(记者张晓兰)5月24日,美好置业集团股份有限公司(简称“美好置业”)发布关于全资子公司被启...
2023-05-265月24日,为爱减肥的广东少女小玲离世消息登上热搜。记者注意到,小玲的故事来自B站的《闪闪的儿科医生》第
2023-05-25近日,广东东莞。刘先生店里一名顾客6岁的女儿,剪掉另一位顾客大把头发,报警后女孩家长赔偿了11500元。刘
2023-05-25今天来聊聊关于被隔壁直男看上怎么办完整番外,被隔壁直男看上怎么办的文章,现在就为大家来简单介绍下被隔
2023-05-25近日,关于有券商一次性解散公司自营部门的消息引发讨论,与此同时,一份中泰证券已免去4位相关负责人职务
2023-05-255月23日,广州市人民政府官网发布《广州市公安局交通警察支队关于延长非广州市籍中小客车通行管理措施通告
2023-05-25舜网社会频道发布各类社会新闻,社会万象第一时间呈现。
2023-05-25三峡晚报讯(记者柳振洲)5月24日晚8时,宜昌籍运动员江雨瑶在2023年第九届中俄青少年运动会女子组100米蝶
2023-05-25凤凰网科技讯5月25日消息,网易发布2023年第一季度财报。其中,净收入250亿元,市场预期248亿元;非公认会
2023-05-25原标题:全国托育服务宣传月活动开启,多地积极探索新模式——(引题)助力解决职工“带娃难”,家庭托...
2023-05-251、最近找工作大军中,很多人喜欢营养师这份工作,但是需要考营养师证。2、那怎么考营养师证呢?。本文分享
2023-05-25要前往黄山风景区,您可以乘坐公共交通工具或出租车。黄山北站作为一个铁路站,您的选择取决于您的预算、出
2023-05-25本文来源:时代周报作者:张照近日,拥有武汉本土电竞俱乐部“eStarpro”和深圳“V5”两支明星战队的电...
2023-05-2528日客场远征已报名700余人,经与申花双方友好沟通,远征名额增加到1000人,截止时间提前至26日10:00,欲报
2023-05-25其中,核心成员薛某等负责对接境外诈骗团伙,从境外获取潜在被害人的名单和电话信息,并将名单分包给下层组
2023-05-25安宁控股(00128)涨超21%,截至发稿,涨21 33%,报0 45港元,成交额339 5万港元。
2023-05-25“本次房展会对提振住房消费信心,推动阿荣旗房地产市场企稳回升有着积极的作用。”阿荣旗住建局相关负...
2023-05-25当地时间5月24日,美国财政部部长耶伦表示,维持6月初为债务违约的最后期限,并称她将很快向国会通报政府财
2023-05-25Copyright © 2015-2022 每日水产网版权所有 备案号:浙ICP备2022016517号-15 联系邮箱:5 146 761 13 @qq.com