当前信息:解剖屎山,寻觅黄金之第二弹
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。a...
2023-04-07大家好,我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...
2023-04-07这12位明星中首当其冲的就是张继科的前女友景甜,据某Z姓娱记透露,张继科此前已经欠下了景甜超过千万元...
2023-04-07杭氧股份:关于股票交易异常波动的公告
2023-04-06智通财经APP讯,中国海诚(002116)(002116 SZ)公告,公司于2023年4月6日收到深交所上市审核中心出具的《...
2023-04-06直播吧4月6日讯英超第30轮阿森纳将在客场对阵利物浦,赛前在接受采访谈及这场的结果时,赖特表示他支持...
2023-04-06上证报中国证券网讯据生态环境部消息,4月6日,生态环境损害赔偿制度改革工作推进视频会议召开,总结全...
2023-04-06人逢喜事精神爽,沈梦露最近是好事连连,因此比赛状态也是越来越好,左路飞翼也是名不虚传。沈梦露的横...
2023-04-06马克龙现场“纠正”黄渤法语发音!黄渤高情商回答逗乐巩俐!!今天的关注度非常高,直接上了热搜榜,那...
2023-04-06孙殷彤江倩倩中青报·中青网记者王烨捷日前,上海交通大学ACM班迎来了开办20周年纪念日。记者从上海交大...
2023-04-06刚刚,银保监会发布提示!银保监会4月6日发布2023年第1期风险提示指出,老年消费者应提高警惕,不信“偏...
2023-04-06央广网北京4月5日消息据中央广播电视总台中国之声《新闻超链接》报道,近日,由中国血脂管理指南修订联...
2023-04-06近日,由中国科技新闻学会、湖南省科协、衡阳市人民政府联合开展的2022年大数据科技传播奖评选活动揭晓...
2023-04-06昆船智能30131104月06日在投资者关系平台上答复了投资者关心的问题投资者上海洋山港的agv引导车是否出自...
2023-04-06近日,由区文化旅游局执法大队和区文化旅游管理事务中心(文物管理事务中心)组成检查小组,对区内部分...
2023-04-06新京报贝壳财经讯4月5日,经文化和旅游部数据中心测算,2023年清明节假期(4月5日),全国国内旅游出游2...
2023-04-06【资料图】据巴克莱的数据,资金涌入最安全的货币市场共同基金的浪潮才刚刚开始,在接下来一年还将有多...
2023-04-061、格美从事生产研发建筑环保新材料产业为主体,生产销售MCM软瓷、软瓷砖、柔性面砖、柔性饰面砖、软石...
2023-04-06制作步骤1 将李子洗干净后彻底晾干水分。2 水果刀用酒精擦干净消毒后将李子切十字刀。3 将泡酒器皿用...
2023-04-061、我个人建议,刚开始的小卖家们,不要盲目的去自己进货,我敢保证,你们要是一开始就自己进货回来做,...
2023-04-06美丽重生2怎么下载?想要比别人更加抢先抢快的玩到这款游戏,那么你获取游戏开测消息是关键,能够获取到...
2023-04-054月4日,天水市人社局就业和人才中心副主任安军旺带领就业促进科、就业服务科、创业指导科、职业能力建...
2023-04-052023贵州一模也叫作贵州高三适应性考试,将于4月8日进行考试,各科试卷及答案届时同步更新,在本文圆梦...
2023-04-05一、工伤官司诉讼费谁承担工伤官司诉讼费一般由提起诉讼的原告预交案件受理费,原告自接到人民法院预交...
2023-04-051、GIANT(捷安特)ATXPRO,分为经济版、中配版、高配版、顶配版。2、2、GIANT(捷安特)ATXPRO经
2023-04-05本人为同人文。有ooc情节,请酌情观看。希望各位看的开心,本up主也很喜欢写轻松剧情类的同人文。喜欢的...
2023-04-054月4日,七匹狼(002029 SZ)发布2022年年度报告。2022年,七匹狼实现营业收入32 28亿元,同比下降8 13...
2023-04-05新华社重庆4月5日电(记者陈键兴、王承昊、刘恩黎)青山埋忠骨,英名垂千秋。4日上午,马英九一行来到位...
2023-04-05今天小编肥嘟来为大家解答以上的问题。江西省农村信用社客服电话人工服务,农村信用社客服电话人工服务...
2023-04-05“注册‘惠企通’后,及时了解到新余市渝水区的惠企政策,享受了支持新兴产业倍增发展兑现的资金奖补210...
2023-04-051、报名序号是报考人员报名确认和上网打印准考证的关键号码,务必牢记。2、通过资格审查的报考人员可在2...
2023-04-051、《夏日之王》百度网盘高清资源免费在线观看;链接:提取码:li37《夏日之王》是由CBSFilms公司于201
2023-04-04直播吧4月4日讯德转在更新球员身价后盘点了目前世界足坛中场位置身价最高前十位榜单,其中贝林厄姆以1 ...
2023-04-04每日互动:独立董事关于第三届董事会第五次会议相关事项的独立意见
2023-04-04早在2019年前后,国内造车新势力的发展步入鼎盛时期,数百家车企遍布国内大小城市,被视作当之无愧的“...
2023-04-042023年3月份济南市场保持回温态势,主城区商品住宅成交约84 8万平,环比微降但同比保持上涨。2023年1-3...
2023-04-04近日,VGChartz公布了索尼PS5主机最新的销量数据。目前,这款主机在全球范围内已经售出了3354万台,甚至超过了任
2023-04-04上海超级母基金备案,200亿
2023-04-04全力支持全市各区、管委会和各部门有效利用金融专项贷款政策,我市又有新动作。近日,市发改委会同国家...
2023-04-04公元221年,刘备发动了浩浩荡荡的东征。此役讨伐东吴名为二弟关羽报仇,实为夺回荆州四郡,若有机会当然...
2023-04-04央视网消息:在上海,眼下,上海崇明为期42天的花朝节正在举行,吸引许多市民游客踏青赏春,寻觅乡村野...
2023-04-04通润装备(002150)04月04日在投资者关系平台上答复了投资者关心的问题。
2023-04-04本文转自:厦门日报融资租赁从0到1厦门自贸片区有秘诀形成全国重要的融资租赁产业集聚区,打造高质量发...
2023-04-04中国公司将推出“太空殡葬”今天的热度非常高,现在也是在热搜榜上了,那么具体的中国公司将推出“太空...
2023-04-04据中国报告大厅对2023年4月4日甲酸钠价格最新走势监测显示:2023年4月4日甲酸钠均价3000 0元 吨,上一报价日
2023-04-04路由器怎么恢复出厂设置重设密码大家都知道现在是互联网络时代,越来越多人都喜欢呆在家中工作,这样方...
2023-04-04近日,湛江经开区教育系统“传承红色基因共建红树林之城”诗文朗诵活动总决赛在该区第五中学隆重举行,2...
2023-04-04近日,兴业银行发布2022年年报,其去年归母净利润达到913 77亿元,同比增长10 52%,增速在国有行、股...
2023-04-04近日,在潍烟高铁站房莱州站候车大厅施工现场,记者看到,大厅的雏形已经凸显,工人们正在加紧进行装饰...
2023-04-041、三国英雄公测服务器设置!!三国英雄:sgyx game topzj com三国英雄公测服务器设置三大首都出售一,二,
2023-04-04京东方A公告,2022年公司实现营业收入1784 14亿元,同比下降19 28%;归母净利润75 51亿元,同比下降7...
2023-04-03配置方面,VAIOF16笔记本可选i3-1315U、i5-1334U和i7-1355U三款处理器,内存可选8GB 16GB 32GB,SSD可选256GB 512GB…
2023-04-03公安部4月3日发布108项公共安全行业标准,其中一项是《摩托车、电动自行车乘员头盔》国家标准。市场监管...
2023-04-034月3日,来自重庆市市场监管局消息称,去年9月份以来,重庆在全市范围内组织开展了为期6个月的医疗美容...
2023-04-03生态环境变美苍鹭翩翩筑巢酉阳
2023-04-03观点网讯:4月3日,根据深圳顺丰泰森控股(集团)有限公司2023年度第二期超短期融资券发行情况公告披露,...
2023-04-031、用鼠标和键盘使用!安装好之后再放歌进去就行如何使用千千静听有时候想听着电脑里面播放的歌曲睡觉。...
2023-04-03东证期货:PTA现实阶段性偏强,估值有冲高回落风险金十期货4月3日讯,据东证期货4月3日发布的报告,近月...
2023-04-034月3日,浙江中科磁业股份有限公司(下称“中科磁业”,SZ:301141)在深圳证券交易所创业板上市。本次上...
2023-04-03许晴与冯小刚近日在法国威尼斯的度假照片再度引起媒体的关注,他们之间的关系扑朔迷离。许晴和冯小刚的...
2023-04-03太平洋金生无忧(少儿版)优点是重疾责任保的专业,各个年龄阶段都有赔付,增值服务比较出彩;缺点在于...
2023-04-03据正观新闻,继3月29日拼多多小二在朋友圈怒斥恶意“炸店”事件、直陈“破坏别人并不会让你变好”之后,...
2023-04-03一、万宁最新疫情消息-数据概览:1、新增本土:0;2、新增无症状:0;3、现有确诊:49;4、累计确诊:31...
2023-04-03长江商报记者李立长江商报消息曾豪掷两百亿拿下万达文旅资产的富力地产,如今却成为亏损王。3月31日,富...
2023-04-03记者从芜湖市交通运输局获悉,2023年全市将完成交通建设投资150亿元以上。包括完工高速公路30公里,...
2023-04-03商报全媒体讯(椰网 海拔新闻记者陈王凤通讯员杨永光、张佳欣)“从项目报装到并网仅5天,对我们企业帮...
2023-04-03央视聚焦!东风在雄安新区拿下“第一”
2023-04-03第九届海昌海洋公园公益月启动
2023-04-03由宁波很不厉害影视制作有限公司出品,乐推(上海)文化传媒有限公司、丽水众志影业有限公司、宁波众心...
2023-04-03情人节送什么礼物最感动人?1、情侣手表手表就是时间的意思,表示要 ">
2023-04-03上证报中国证券网讯(记者费天元)中金公司3月31日晚间披露年报。2022年,中金公司实现营业收入260 87...
2023-04-01东湖评论:共享文旅盛会同创美好生活---黄陂拥有盘龙文化、木兰文化、“二程”文化、红色文化四张文化名...
2023-04-01加拿大轻轨列车上演活春宫!一对男女在众目睽睽之下全裸做爱,仅用一张毯遮掩,以为没人看见,实际上因...
2023-04-011、手出汗与身体其他部分出汗不同。2、其他部分出汗,是因为热,越热汗就越多。3、手心出汗,与身体素质...
2023-04-01据证券之星公开数据整理,近期恒生电子(600570)发布2022年年报。根据财报显示,本报告期中恒生电子增...
2023-04-011、不好意思这个问题我帮不了你,你说的这本小说我没看过,不过我建议你去若初文学,网上看看。2、上面...
2023-04-01丰城市上塘镇开展人居环境整治
2023-03-31恒为科技3月31日发布投资者关系活动记录表,公司于2023年3月31日接受22家机构调研,机构类型为保险公司...
2023-03-31你知道自然灾害综合风险普查吗?它会如何影响我们生活?2020—2022年开展的第一次全国自然灾害综合风险...
2023-03-31德邦证券03月31日发布研报称,给予大中矿业(001203 SZ,最新价:11 98元)买入评级。评级理由主要包括...
2023-03-31绿的谐波3月31日收到上交所问询函,公司拟向不超过35名特定对象发行不超5057 50万股公司股份;募资不超...
2023-03-31通常春节档高峰期过后,三、四月份常被电影业内人士视为“冷门档期”,而今年这个时间段的电影市场却格...
2023-03-311、栗胁雀鹰,脊索动物门、鸟纲、隼形目、鹰科、鹰亚科、鹰属,分布于非洲中南部等地区。2、包括阿拉伯...
2023-03-311、按快捷键 " "调出 " ",如下图所示:2、在 " "中输入 " ",点击 " ",如下图所示:3、点击 " "下的 " ",如下图所
2023-03-31今天小编肥嘟来为大家解答以上的问题。抗菌素软膏有哪些药,抗菌素相信很多小伙伴还不知道,现在让我们一...
2023-03-31马特乌斯对拜仁很有信心:“拜仁将会赢得这场比赛,因为他们受了刺激,这对他们的对手来说很少是愉快的...
2023-03-31全省事业单位联考取消缩减部分岗位今日17时前可改报生活报讯(记者吕晓艳)生活报记者从省人社厅获悉,...
2023-03-31大家好,小乐来为大家解答以上的问题。终结的炽天使第三季什么时候出来,终结的炽天使第三季什么时候开播...
2023-03-31抄写作文网小编为大家提供最好背的有哪些古诗好背的古诗有哪些?来供大家参考,欢迎阅读。十首古诗词简单...
2023-03-31连续第7周新房成交量过千套!据湖南中原研究院今日最新发布的数据:2023年3月第4周,长沙内五区一手住宅...
2023-03-31抄写作文网小编为大家提供李清照写的有哪些古诗李清照都有哪些古诗哪些古诗作品?来供大家参考,欢迎阅读...
2023-03-313月30日,东方集团(600811)融资买入574 84万元,融资偿还867 99万元,融资净卖出293 15万元,融资余额5 53亿元。
2023-03-311、∑这一符号表示求和。2、符号下i=1,符号上是n,表示从1到n项的数据求和。3、数据就是后面的公式中数...
2023-03-31根据著名的硬件泄密者@Zed__Wang的说法,Nvidia打算在5月至6月期间发布其廉价的GeForceRTX4050和GeForce...
2023-03-313月30日热泵板块较上一交易日上涨1 26%,海信家电领涨。当日上证指数报收于3261 25,上涨0 65%。深证...
2023-03-31又一组织对OpenAI发出控诉要求FTC调查并暂停其ChatGPT部署;据美国科技媒体TheVerge报道,当地时间周四
2023-03-31据腾讯官方微信号,微信新上了一些新能力。3月28日,2023微信公开课PRO·微信之约在广州正式开讲,视频...
2023-03-30北京国安U21有一位来自云南的逐梦勇士。11岁的段德智选择背井离乡,只为了他心中的足球梦想;亚冠157天...
2023-03-30图为粉白的樱花在湖边绚丽绽放。刘力鑫摄图为粉白的樱花在湖边绚丽绽放。刘力鑫摄图为成片的樱花竞相绽...
2023-03-30看到我这个标题,估计不少网友都会产生硕大的疑问。腐殖酸什么东西?它不是肥,为何比肥还要好8000倍呢...
2023-03-30大范围暴雨已经减弱!在今年以来最强的冷暖对峙中,3月20日-27日南方遭大范围暴雨袭击,福建、江西和广...
2023-03-30Copyright © 2015-2022 东方水产网版权所有 备案号:沪ICP备2020036824号-8 联系邮箱:562 66 29@qq.com