大家好,我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啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。a...
04-17 19:42:48
想要用手机转账的话,可以通过用手机支付宝进行转账,点击选择想要转账的好友,然后输入转账金额,之后...
04-17 18:24:18
汤姆猫跌6 6%近1年半券商无研报
04-17 17:41:54
1、推销电话称为COLDCALL可以想象就是不认识的人突然来电。本文到此分享完毕,希望对你有所帮助。
04-17 16:53:47
1997年,苹果一度濒临破产,但之后史蒂夫·乔布斯重新回到公司后,推出了一个又一个成功的产品。蒂姆·...
04-17 16:10:50
1、学校的简介就不多给你介绍了,河南工业职业技术学院在河南省是高职高专类院校中的示范院校,机电系是...
04-17 15:13:02
一、詹姆斯八村塁的表现简直太棒了直播吧4月17日讯NBA季后赛首轮G1,湖人128-112力克灰熊,系列赛大比分1-0
04-17 13:57:50
至当地时间17日上午,中暑引发的死亡人数上升至11人,另外超过120人因在太阳下暴晒出现如脱水等健康问题
04-17 13:12:26
他的到来给了我们打法上有不同的选择,去年没有这样的支点中锋,现在他有这个特点,可以给我们创造很多...
04-17 11:50:41
2023年4月17日,白酒概念上涨,截至10:43,该概念上涨1 21%,相关个股方面,青海春天上涨6 37%,迎...
04-17 11:12:24
[新闻页-台海网]海湾阿拉伯国家合作委员会(海合会)六个成员国以及埃及、伊拉克、约旦的外长14日在沙特...
04-17 10:10:58
央广网北京4月17日消息为加强“双师型”教师队伍建设,打造一批国家级职业教育教师培训样板和标杆,近日...
04-17 09:55:26
中信建投指出,白酒行业全年景气度大概率向上,市场回落正是布局期。受制于3月份白酒淡季部分主流产品价...
04-17 08:52:46
证券时报记者赵梦桥“全则必缺,极则必反,盈则必亏”。在去年大盘走低的背景下,新能源的主题股票、基...
04-17 07:31:46
69岁生日派对的装饰品和食物应该像为较年轻的年龄组一样喜庆。虽然传统上不被视为里程碑,但一个人的69...
04-17 06:12:53
今天来聊聊关于雪弗板字体效果图,雪弗板字的文章,现在就为大家来简单介绍下雪弗板字体效果图,雪弗板...
04-17 05:11:16
4月16日,20万级纯电轿车市场再次迎来搅局者,广汽埃安旗下的昊铂HyperGT(图片),以21 99-33 99万的价...
04-16 23:49:57
北京时间4月16日21点,英超第31轮,阿森纳将在客场对阵西汉姆联,本场比赛津琴科将因伤缺阵。不过据Stan...
04-16 21:15:32
买500亿黄金!中国不断买入;拒绝放行黄金,美国怕什么?,美债,中国,央行,黄金储备,外汇储备,美国国债
04-16 19:16:42
与朋友或爱人告别并不总是那么容易。但是通过举办告别派对,您可能会发现,在您玩游戏和分享欢笑的同时...
04-16 18:21:33
“半壁江山”与“养鱼”汕头市澄海区政协常委、澄海玩具协会名誉会长杜瑞生是当地较早一批做玩具的企业...
04-16 17:53:05
1 徐州到大连旅游攻略枣庄火车1470 1471(徐州~哈尔滨)14:38---第二天5:09锦州下车票价123元。锦州k7...
04-16 16:13:50
近期,多名网友在社交平台上反映,北京地铁站内佩戴口罩的提示标语被工作人员撕除。
04-16 14:05:46
开年以来,随着中国经济加速重启,国内奢侈品市场迎来强劲复苏。受此推动,LVMH、爱马仕等全球奢侈品销...
04-16 12:15:21
活动现场,工作人员通过张贴国家安全日宣传海报、悬挂横幅、发放安全防范手册等形式,向居民宣传国家安...
04-16 10:07:20
1、一般二级公立医院的无痛人流费用在1000到1500左右,而公立医院的费用往往在1500到2000左右。2、此费用包括
04-16 08:52:31
来源:微信公众号:教师营(ID:jiaoshiying365)有人说老师给力、家长接力、学生努力这三点对于好的教...
04-16 06:43:28
1、前言红烧排骨是一道不能再普通的家常菜了,这是娅米的做法,你的咧?材料主料:排骨500g、海天特级草...
04-16 04:03:07
中新网北京4月14日电(记者杜燕)4月15日是全民国家安全教育日,北京市公安局14日召开新闻发布会通报,北...
04-15 22:48:54
1、详细答案:2、裂心战斧,拾取后绑定,唯一,双手斧,230-346伤害速度3 30,(每秒伤害87 3),+27
04-15 20:41:46
中超首轮|浙江vs亚泰首发:四外援PK三外援,谭龙、张佳祺出战
04-15 18:49:46
2023年上半年河北张家口自考准考证打印入口已开通,考生可登录河北省教育考试院打印准考证。具体如下:...
04-15 17:28:40
中新社海口4月15日电(张月和符宇群)第三届中国国际消费品博览会(下称“消博会”)正在海口举行,展会上常...
04-15 15:59:23
大皖新闻讯4月15日上午,国家统计局发布今年3月全国70个大中城市商品住宅销售价格变动情况。大皖新闻记...
04-15 14:04:35
各位自学考试考生:2023年下半年吉林自学考试办理免考时间为:8月31日至9月2日,办理免考的地点是各市(...
04-15 12:05:49
1、《心地含诸种》是温馨演唱的歌曲,由慧能作词,杜寒风作曲,收录于《心地含诸》专辑中。2、。本文到...
04-15 11:06:09
CBA官方宣布,CBA公司高度重视,已就上海vs江苏G3比赛情况展开调查,中国篮协也第一时间责成CBA公司查明...
04-15 09:42:06
小卡:季后赛所有事都会被放大我们的目标就是赢下比赛,小卡,快船队,菲尼克斯,科怀·伦纳德
04-15 07:59:03
如今的手机市场被苹果、三星等安卓手机所主导。但是人的审美总是在变的,总是面对同样的系统界面难免会...
04-15 06:16:21
林柏光结婚,林柏光这个很多人还不知道,现在让我们一起来看看吧!1、曾演剧集: KonRerngMuang(Ch5)...
04-15 03:06:51
1、国王:是权威的象征女皇:令人有种无忧无虑悠闲自在的感觉高塔:挑战自然只会引来神的怒火隐者:隐者...
04-14 22:48:02
砭石腰带适用于砭石感法和温法。砭石感法分直接接触和间接接触。砭石温法是以加热后的砭石腰带直接或间...
04-14 21:16:58
4月14日,据清凉海南微信大众号:三亚市旅行和文明广电体育局原党组成员、副局长韩建平涉嫌严峻违纪违法...
04-14 20:13:57
智通财经讯,通灵股份(301168 SZ)公告,公司持股5%以上股东扬中市金融控股集团有限公司减持时间已经过...
04-14 19:04:50
18岁正是青春期,是一期中青春期的年华活力。男孩子的心理期望很大,对自己的期待。18岁生日就要成年人...
04-14 18:18:49
我们都知道,耳洞打完之后,耳洞里面是需要放耳棒,防止耳洞堵塞,有些人会戴银棒,而有些人会戴茶叶棒...
04-14 18:00:15
友达光电将于TouchTaiwan2023推出首款商品化1.39寸MicroLED智能手表。
04-14 17:13:08
据光明日报报导,2022年度人民文学奖颁奖典礼13日在四川泸州举行。贾平凹的《秦岭记》和庞贝的《乌江引...
04-14 16:17:22
4月14日收盘,川仪股份涨7 68%,报收41 34元,换手率0 72,成交量281 01万股,成交额1 13亿元。根...
04-14 15:20:23
新华财经北京4月14日电(董时珊)新华社石油价格系统4月14日发布的数据显示,4月13日一揽子原油平均价格变...
04-14 14:38:57
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。a...
2023-04-17
想要用手机转账的话,可以通过用手机支付宝进行转账,点击选择想要转账的好友,然后输入转账金额,之后...
2023-04-17
汤姆猫跌6 6%近1年半券商无研报
2023-04-17
1、推销电话称为COLDCALL可以想象就是不认识的人突然来电。本文到此分享完毕,希望对你有所帮助。
2023-04-17
1997年,苹果一度濒临破产,但之后史蒂夫·乔布斯重新回到公司后,推出了一个又一个成功的产品。蒂姆·...
2023-04-17
Copyright © 2015-2022 东方纤维网版权所有 备案号:沪ICP备2020036824号-8 联系邮箱:562 66 29@qq.com