解剖屎山,寻觅黄金之第二弹
大家好,我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啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我 -
成交额居榜首!这一巨头,股价“11连涨”!
分析认为,周五金价下跌的主要原因是美元指数上涨和获利回吐所致,同时 -
2023年农历5月剖腹产吉日吉时辰 2023年...
在农历5月,也有很多适合剖腹产的吉日吉时,打算在这个月剖腹产的朋友 -
和钱有缘的5个生肖,一时缺钱,半生富裕...
有些生肖在财富方面似乎更加有福气,他们在一生中往往能够从贫困中脱身 -
天津夏季达沃斯论坛期间将举办主题城市论坛
6月27日至29日,2023年新领军者年会(天津夏季达沃斯论坛)将在津举办。 -
ikbc和cherry哪个好(ikbc)_天天新要闻
来为大家解答以上问题,ikbc和cherry哪个好,ikbc很多人还不知道,现在
精彩推送
-
解剖屎山,寻觅黄金之第二弹
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我 -
博纳董事长于冬:剧集的崛起是对电影真...
搜狐娱乐讯(哈麦 文)6月10日,第二十五届上海国际电影节开幕论坛举办 -
环球快看:爽文剧女主的代表!这3大星座...
有的时候我们总是被一些表象蒙住了双眼,而忘记了用理智去摸索那些真相, -
世界热门:世界报道:焦点热文:潘达利亚...
(相关资料图)1、在玩家踏入新地图之后,将会开启许多潘达利亚飞行点, -
成交额居榜首!这一巨头,股价“11连涨”!
分析认为,周五金价下跌的主要原因是美元指数上涨和获利回吐所致,同时 -
和钱有缘的5个生肖,一时缺钱,半生富裕...
有些生肖在财富方面似乎更加有福气,他们在一生中往往能够从贫困中脱身 -
蔚来李斌:有信心实现下半年平均月销超...
在第一季度财报电话会议上,蔚来汽车CEO李斌表示,最近市场变化非常大 -
中国石化牵头承建国家能源研发创新平台
本报记者向炎涛6月9日,《证券日报》记者从中国石化新闻办获悉,近日, -
下单成年陪玩来的却是未成年人?陪玩行...
近年来,随着互联网经济的发展,“陪玩”悄然兴起。记者调查发现,... -
2023年农历5月剖腹产吉日吉时辰 2023年...
在农历5月,也有很多适合剖腹产的吉日吉时,打算在这个月剖腹产的朋友 -
直击2023中国经济传媒大会丨北京工商大...
每经记者:叶晓丹每经实习记者:黄海 每经编辑:陈俊杰《每日经济新闻 -
堪比加油!宁德时代快充新进展:充电不...
堪比加油!宁德时代快充新进展:充电不到10分钟续航超400公里 -
ps羽化在哪找到(ps羽化在哪)
来为大家解答以上问题,ps羽化在哪找到,ps羽化在哪很多人还不知道,现 -
苹果M2 Ultra在Geekbench 5跑分并没有...
在这次WWDC23上面,苹果不算太意外地带来2023款MacPro,最主要的卖点就 -
开电车去大西北也不慌了 福特申请外置...
开电车去大西北也不慌了福特申请外置电池技术专利:背个充电宝 -
天津夏季达沃斯论坛期间将举办主题城市论坛
6月27日至29日,2023年新领军者年会(天津夏季达沃斯论坛)将在津举办。 -
非遗融入生活 文化自信自强_全球快播
天津北方网讯:主题为非遗融入生活,文化自信自强的非遗展示展演活动, -
焦点播报:一张图让女朋友知道新能源车品...
一张图让女朋友知道新能源车品牌档次热传:特斯拉一线豪华你认同吗? -
ikbc和cherry哪个好(ikbc)_天天新要闻
来为大家解答以上问题,ikbc和cherry哪个好,ikbc很多人还不知道,现在 -
当前最新:多地高铁晚点 最长4个半小时...
多地高铁晚点最长4个半小时!有乘客错过资格考试 -
世界热文:洗衣机不脱水怎么修理视频教...
来为大家解答以上问题,洗衣机不脱水怎么修理视频教程,洗衣机不脱水很 -
谷草转氨酶和谷丙转氨酶偏高的原因及危...
1、指导意见:转肽酶:在肝内主要存在于肝细胞浆和肝内胆管上皮中。2、G -
天天观天下!鲁溪桥村_关于鲁溪桥村简述
小伙伴们,你们好,今天小夏来聊聊一篇关于鲁溪桥村,关于鲁溪桥村简述 -
世界快看:黑龙江12件涉黑涉恶案件集中...
据新华社,从黑龙江省高级人民法院了解到,为深入推进常态化扫黑除恶斗 -
新华全媒+|夜幕下,一个群体带动城市消...
海报制作:方金洋新华社天津6月9日电(记者郭方达宋瑞)放上置物架、挂 -
红酒和杏仁能同食吗?
能同食,红酒和杏仁是能同食的,我们在进行喝红酒的时候,大部分都是葡 -
观天下!国产CPU正式量产交付 并出口国外
周末最新消息称,最近新一批的自主研发CPU正式交付,而且已经在国外市 -
杭州国家版本馆:宋韵悠长,文“润”江南
杭州国家版本馆:宋韵悠长,文“润”江南---杭州国家版本馆,又名“... -
全球信息:追光 | 明晨,看18年后的伊...
就让我们屏气凝神拭目以待记者:韦骅编辑:郑昕、王沁鸥。 -
我国运载火箭落区控制技术获新突破 全...
此次任务为未来火箭实现可控回收、垂直返回等新技术奠定了重要的技术基 -
中国首座大型区域综合性非遗馆将在杭开馆
每经AI快讯,日前,从浙江省非物质文化遗产保护中心获悉,全国首座大型 -
sd卡坏了修复手机软件有什么方法
关于sd卡坏了怎么修复手机软件的内容,很多小伙伴都在查找,但是不少人 -
成年矫正牙齿会不会牙齿松动,成人矫正...
牙齿整齐洁白,自然会给外人留下非常好的印象,而且因为有些明星会说自 -
环球速看:恭喜梅西!迈阿密新阵容曝光...
在梅西官宣加盟了迈阿密国际之后,大家也知道下赛季大家将会看到一个养 -
天天滚动:windows7旗舰版密钥_window7旗舰版
1、发行日期2009年。2、2009年10月23日发布windows7,2011年2月23日发布windowssp1。 -
天天精选!环球视点!全球财经连线|专...
南方财经全媒体记者胡慧茵广州报道随着我国经济进入高质量发展阶段,我 -
win10怎么关闭自动更新补丁_win10怎么关...
1、最好不关闭。2、WIN10还不断的完善中,会经常更新。以上就是【win10 -
国铁:今起12306试行在线选铺服务 具体...
【国铁:今起12306试行在线选铺服务】6月10日起,12306网站试行在线选 -
当前头条:关晓彤是哪个经纪公司
明星经纪公司一直是娱乐圈中不可或缺的一环,他们负责着明星的签约、管 -
这就是信心|优化营商环境 各地硬招、...
这就是信心|优化营商环境各地硬招、实招频出 -
【全球速看料】延庆区:乡村产业振兴新...
忙碌了2个多月的乡亲们见到了收益,更坚定了探索绿色生态农业致富路的 -
高质量发展调研行 | 在智慧港口见证大...
提到港口,你会想到什么?头戴安全帽的工人在操作吊机,还是一辆辆卡车 -
环球精选!西瓜为什么越卖越贵,便宜的...
还我吃瓜自由 -
微信阅读2购买路径 微信阅读如何购买书籍
微信读书阅读器2代在微信读书商城买。微信读书阅读器2 0确实是一款优秀 -
联想服务器营收增速全球最猛 市占率连...
以ChatGPT为代表的人工智能火遍全球,作为基石的服务器市场也迎来爆发 -
世界通讯!绝了,哈登欲再联手杜兰特!...
这次联盟中大量的高管都认为这笔交易是很有可能发生得了,主要还是恩比 -
全球首款智电旅行车 蔚来ET5旅行版上市...
全球首款智电旅行车蔚来ET5旅行版上市定档:或售30多万对刚极氪001 -
陕西西安推动“十里沣河”文旅深度融合...
沣河景色。位于“十里沣河”文旅带的昆明池七夕公园。以上图片均为... -
2023年第三期和第四期储蓄国债(电子式...
此外,值得关注的是,两期国债发行期内不得提前兑取,发行期结束后可提 -
今年端午假期或成近五年最火端午:消暑...
五一劳动节之后的下一个法定节假日端午节快来了,按照相关安排,6月22 -
浙江一奥迪纯电车起火 大灯还亮着 网...
浙江一奥迪纯电车起火大灯还亮着网友:不愧是灯厂 -
文化IP智能应用让历史文化“活”起来
深圳新闻网2023年6月10日讯(深圳特区报首席记者戴晓蓉)在数字时代, -
百万豪华轿车 比亚迪仰望全新车型曝光...
百万豪华轿车比亚迪仰望全新车型曝光:激光雷达+三屏 -
今日视点:我是大运火炬手|倮伍克的子...
在倮伍克的子看来,这一次,开在家门口的大运会是个让全世界深度了解成 -
焦点热议:冬天的花有哪些?你都见过吗?
冬天养什么花,有三种花,冬天开了春天又开,又美又艳,谁看了都喜欢! -
普京称乌克兰反攻已经开始 具体是什么...
【普京称乌克兰反攻已经开始】近日,普京称,乌克兰军队发起了反攻,但 -
2023年三亚日报 “爱在三亚 情定天涯...
三亚的单身朋友们久等了,2023年三亚日报“爱在三亚情定天涯”公益... -
每日消息!热拉帮 电视剧 热拉帮
1、角色 演员备注酷卡Cooka 娜娜Tina 安达崔雅琦 爱莎 -
【天天热闻】赶紧转给爸妈!陕西警方紧...
点击上方“陕西新闻广播”,关注我们哦!安康两地警方发布紧急预警... -
希罗在首轮对阵雄鹿的系列赛中遭遇手部...
今天8点半热火继续坐镇主场迎战掘金,目前他们大比分1-2落后。热火球星 -
环球观速讯丨快乐大本营 直播间_快乐大...
1、首先进入百度ww baidu com主页。2、因为《快乐大本营》是湖南卫视播 -
传承与发扬!走进非遗,探寻黄龙猎鼓魅力~
2023年6月10日是“文化和自然遗产日”非物质文化遗产是人类“活态灵... -
武汉挂牌21宗地块:17宗宅地起始总价超2...
6月9日,武汉发布武告字(2023年)8号拍卖公告,此次共出让21宗地块, -
世界热讯:省市区联合开展 “国际档案日...
工作人员向市民发放宣传材料。记者杨艳辉摄昆明信息港讯(昆明日报记者 -
星空有约|咔嚓!来和美丽的银河“同框”...
进入6月,银河开启最佳观测期。在远离光污染的地方,如郊外、农村、高 -
godkeen旗舰店_godkeen
1、godkeen是一个男装品牌,也是一个国产的服装品牌,近几年的发展相当 -
50岁大叔当主播,养活一个剧团! 观热点
最近 50岁大叔当主播月入过万养活一个团 冲上了热搜不少网友好奇年近 -
跨越山川大海,这场教共体活动干货满满
潮新闻客户端通讯员钱佳芹近日,杭州市丁兰实验中学的单星梅老师和陈文 -
【天天报资讯】广州拟限行电动自行车公...
广州拟限行电动自行车公交优先市民质疑:能解决超速、闯红灯等问题? -
今日观点!【共同缔造安全江夏⑬】创意海...
【共同缔造安全江夏⑬】创意海报:筑牢安全防线,抓好渔业生产---本作 -
传字节内测对话式 AI 产品,代号“Gra...
不止「文心一言」,消息称百度将推出全新AI对话软件「万话」6月9日消息 -
中国移动5G无线主设备集采:超77亿大单...
C114讯6月10日消息备受业界关注的中国移动2023年至2024年5G无线主设备 -
贾跃亭公布FF 91第二、三位车主:都是...
贾跃亭公布FF91第二、三位车主:都是豪奢人士 -
世界观热点:龙腾大湾区|刚刚,粤港澳大...
6月10日上午,沙田镇淡水湖白鹭纷飞,鱼翔浅底,湖面上各支龙舟队伍精 -
观天下!马斯克:推特将向认证创作者支...
月10日消息,推特(Twitter)老板埃隆・马斯克(Elon Musk)刚刚表示, -
中超积分榜:海港领跑三镇仅第8 大连人...
搜狐体育消息,北京时间6月10日,中超联赛第一阶段全部结束,在积分榜 -
弥渡县气象台发布地质灾害气象风险Ⅲ级...
弥渡县气象局、弥渡县自然资源局、弥渡县应急管理局2023年6月10日10时3 -
文博会云上追星、媒体主播线上带货 火...
在11号馆粤港澳大湾区馆,主播通过直播间推销珠宝。深圳特区报记者杨浩 -
刘奕君:逆反大叔的坚韧_天天视讯
中年逆反、闹离婚,热播剧《熟年》中的倪伟强被很多人共情了,刘奕君的低 -
全国首家“特斯拉GIGA实验室”亮相:沉...
全国首家“特斯拉GIGA实验室”亮相:沉浸体验45秒造一辆车 -
蔚小理:三兄弟反目成仇
蔚小理:三兄弟反目成仇 -
环球热消息:健康到家,您今日饮咗未?
为了延续益力多优质的家庭配送服务,把健康美味的产品呈送给广大客户, -
RK3588-MIPI屏幕调试笔记:RK3588-MIPI-DSI之屏参配置
RK3588-MIPI屏幕调试笔记:RK3588-MIPI-DSI之屏参配置 -
广西启动2023年普通高校毕业生就业百日...
近日,自治区人力资源社会保障厅、自治区教育厅联合印发通知,部署开展 -
丰田真急了!汉兰达新车型正式上市 :2...
丰田真急了!汉兰达新车型正式上市:28 28万起厂家再补2万 -
支付宝提现多久到账银行卡
本文内容是由小编为大家搜集关于支付宝提现多久到账,以及支付宝提现多 -
不戴不行!电动车头盔新国标下个月施行...
不戴不行!电动车头盔新国标下个月施行:选购小技巧来了 -
全球速看:12306买卧铺票如何在线选铺?...
记者从中国国家铁路集团有限公司(下称“国铁集团”)获悉,6月10日... -
以文塑旅 以旅彰文 融合发展 广东文...
深圳新闻网2023年6月10日讯(深圳特区报记者窦延文 文周红声 图)位于 -
泰兴市气象台发布雷暴大风黄色预警【Ⅲ...
泰兴市气象台2023年06月10日10时19分发布雷暴大风黄色预警信号:预计今 -
Cortex-A9与A8处理器在功能上有什么区别?
移动设备的CPU更新换代的速度已经迈进了一个日新月异的阶段,去年的Cor -
康美药业怎么回事_康美药业怎么
1、600518康美药业(该股的技术性走势分析)。2、该股前日在其双重底出 -
太惊奇!浙江女子身体里取出“花”!老...
形如玫瑰的结石你见过吗?近日台州一位名叫李红(化名)的女子在医院接 -
全球热讯:亚裔考生"美国高考"近满分,却...
据福克斯新闻网当地时间6月8日报道,在“美国高考”的SAT考试中,佛... -
首台套50万千瓦冲击式水电机组项目开工|...
9日,大唐西藏扎拉水电站主体工程正式开工建设,项目配备首台套50万千 -
天天滚动:河南人的早晨从一碗非遗开始
大象新闻中心记者董大炜2021年6月10日,小吃制作技艺(逍遥胡辣汤制作技 -
340多家葡萄酒企业悉数亮相 第三届葡萄...
今天(9日),国际葡萄与葡萄酒产业大会、第三届中国(宁夏)国际葡萄酒文 -
新一轮“龙舟水”来袭 未来10天 雨雨雨
佛山新闻网讯佛山市新闻传媒中心记者谈飞洋报道:徘徊在广西北部湾一带 -
速讯:饮水机“退烧”,净水器火热?
自从1994年中国第一台饮水机被独立研发出来之后,国内饮水机市场规模就 -
每日精选:试点来了!“0首付”买房,就...
好消息!好消息!好消息!宜宾还没买房的人重磅福利来了宜宾市近期拟出