解剖屎山,寻觅黄金之第二弹-当前通讯
大家好,我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啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于... -
国标红木5属8类33种图价格排序_原木价格排序
1、这个一句两句说不清楚常用的木材有几十上百种主要是看用在什么地... -
法国总统马克龙夫人向即将被送回中国的...
根据博瓦勒野生动物园方面发布的消息,大熊猫“圆梦”将于今年7月4... -
比亚迪e6怎么样?比亚迪e6补贴后的价格...
比亚迪2010年在深圳推出的e6电动出租车已经8年多了,行驶里程超过10... -
梦见自己的车着火_梦见自己的车着火的解释
欢迎观看本篇文章,小升来为大家解答以上问题。梦见自己的车着火,... -
浙江经济观察:金融触角如何伸至个体工...
顾客在米丽食品店购物。洪艇摄中新网台州5月18日电(傅飞扬林婷)每天...
精彩放送
-
解剖屎山,寻觅黄金之第二弹-当前通讯
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于... -
COMEX 6月黄金期货收跌1.26%|关注
COMEX6月黄金期货收跌1 26%,报1959 80美元 盎司,一度跌至1959... -
全国公安机关打击为电信网络诈骗提供“...
新华社北京5月18日电(记者翟翔、熊丰)记者18日从公安部获悉,在公... -
宝马全新5系纯电将国产!尺寸加长 5月2...
智电出行了解到,国产宝马i5长轴距版即将投产,其海外版标准轴距车... -
国标红木5属8类33种图价格排序_原木价格排序
1、这个一句两句说不清楚常用的木材有几十上百种主要是看用在什么地... -
阜丰集团(00546.HK):5月18日南向资金...
5月18日北向资金增持27 2万股阜丰集团(00546 HK)。近5个交易日... -
【环球播资讯】鲁商运河公馆四期的房子...
鲁商运河公馆四期的房子怎么样,鲁商运河公馆这个很多人还不知道,现... -
横岗湖生态乐园_横岗-世界观焦点
1、深圳横岗位于:深圳市,龙岗区,横岗街道。2、公交线路:1号线→... -
成都生育保险报销范围和标准
报销范围1 满足条件的女职工肯定有保子要问了,啥子叫满足条件?就... -
法国总统马克龙夫人向即将被送回中国的...
根据博瓦勒野生动物园方面发布的消息,大熊猫“圆梦”将于今年7月4... -
世界球精选!最精简微信群规_微信群群规...
1、登录微信后,右上角有一个+号,点开后发起群聊,邀请好友进来就... -
头狼:黄金今天真到1950一线?市场这么...
今天预测看1950一线难道黄金真的给狼哥面子指哪打哪黄金日线明显的... -
当好排头兵|呈贡区委主要领导带队拜访...
为认真贯彻落实“当好排头兵”大竞赛关于“‘一把手’招商、精准招... -
王导:黄金有效破位1970,转空头,目标1...
抢多单失败金价破位1970关键支撑实体有效破位瀑布进行中这一次金价... -
美股开盘涨跌不一
18日道琼斯开盘报33374 56点,下跌0 25%,标普500开盘报4157 68... -
方萍萍:黄金1970附近再次出现启动上涨信号
通过对黄金小时图解析得知黄金从早盘到目前为止依然是处于回落调整... -
图灵波浪5.18晚-黄金下跌遇支撑、或反弹...
图灵波浪518晚黄金下跌遇支撑或反弹上涨黄金今天黄金再次出现新的低... -
原创IP市集落地北外滩
IP视听盛宴滨江助力护航北外滩滨江活动介绍近日,上海虹口北外滩举... -
金界传奇:黄金1965-1967继续买入!
这两天的黄金交易非常被动看空不给反弹机会一路阴跌回落即便做空也... -
比亚迪e6怎么样?比亚迪e6补贴后的价格...
比亚迪2010年在深圳推出的e6电动出租车已经8年多了,行驶里程超过10... -
天天新消息丨易极:5.18黄金低位区域震...
黄金4小时结构黄金目前处于下跌的末端行情在空头趋势转变为多头趋势... -
【2023行进黄南看发展】网媒记者走进博...
5月18日,2023“行进黄南看发展”全国网络媒体青海黄南行采访团记者... -
杜康:黄金延续跌势,美盘1980继续空了...
美盘周出请数据利空行情继续破位新低趋势下跌延续那就不用说了继续... -
天天微动态丨什么是led芯片外延异常_什...
LED贴片机是一种全自动的焊接装备,由于LED本身要求防静电措施,而... -
梦见自己的车着火_梦见自己的车着火的解释
欢迎观看本篇文章,小升来为大家解答以上问题。梦见自己的车着火,... -
新疆尉犁县民众播种忙 逾160万亩罗布麻...
地处塔克拉玛干沙漠东北缘的新疆巴州尉犁县境内,林业部门的工作人... -
当前播报:加快义务教育优质均衡发展 全...
央视网消息:近日,财政部下达2023年义务教育相关转移支付资金超两... -
啥时候出第二季呀?感觉生活真的好无味呀
今天是波奇瘾发作最严重的一次,躺在床上,拼命念波奇的名字,难受的... -
关注:前4个月全国税收收入同比增长12.9...
央视网消息:我国的财政收入主要来自于税收,2023年前4个月,全国税... -
浙江经济观察:金融触角如何伸至个体工...
顾客在米丽食品店购物。洪艇摄中新网台州5月18日电(傅飞扬林婷)每天... -
全球热议:阿里国际数字商业集团启动外部...
【阿里国际数字商业集团启动外部融资】财报显示,阿里巴巴集团董事... -
世界观点:塞尔达传说王国之泪电蝙蝠的...
《塞尔达传说:王国之泪》最近发售了,在这个游戏中,有很多的武器... -
远比想象更惊喜,艾瑞泽8开启厦门全优之...
热血集结,驭鉴全能自己;试不可挡,尽显全优本色。5月16-19日,全... -
第九届炭坑电摩大赛·掷地有声
落日的余晖洒下,5月14号,第九届炭坑电摩大赛也迎来完美落幕。作为... -
焦点速看:Bostik 波士胶扩建其在上海...
为了更好地实现对合作伙伴的承诺,Bostik波士胶扩建新的研发技术实验... -
天天快资讯丨建发股份:拟发行10亿元中...
建发股份:拟发行10亿元中期票据-5月18日,据上清所,厦门建发股份... -
中安证券被罚600万港元:担任股份配售代...
中安证券被罚600万港元:担任股份配售代理时犯有缺失,股本,承配,配... -
故宫“数字文物库”文物总数已超10万件
新华社北京5月18日电(记者杨湛菲)5月18日是国际博物馆日。当天,... -
神舟十六号载人飞船本月发射 两个乘组...
神舟十五号航天员六个月的太空出差已经接近尾声,本月10日,天舟六... -
全球看点:新华网评:把“食”事办在老...
宋燕淄博又因为“食”事出圈了。不过,这次圈粉的不是烧烤,而是“... -
全球最新:欧冠本周最佳阵容:B席领衔,...
欧冠本周最佳阵容:B席领衔,曼城6人国米4人米兰1人,曼城,米兰,米4,... -
黄冈首个超200亿元工业项目动工 环球今日报
黄冈首个超200亿元工业项目动工---湖北日报讯(记者柯利华、通讯员... -
秀玉是什么玉能值钱 秀玉 全球热议
今天来聊聊关于秀玉是什么玉能值钱,秀玉的文章,现在就为大家来简... -
欧也妮葛朗台是谁的名字_急求 欧也妮葛...
1、欧也妮:本书女主人公夏尔:开始与欧也妮相爱,后为权势娶了德 ... -
2023-2024哥本哈根皮草可持续时尚大师系...
日前,2023-2024哥本哈根皮草可持续时尚大师系列趋势工坊在北京751D... -
不识庐山真面目只缘身在此山中的意思俗...
1、宋·苏轼《题西林壁》诗:“横看成岭侧成峰,远近高低各不同。2... -
15元命中2300万!幸运购彩者中出今年唐...
5月10日,体彩超级大乐透迎来10亿元大派奖的第14期开奖——第23052... -
润初妍携千名经销商助力洱海保护,建设...
2023年5月10日,润初妍第11届七彩云南品牌盛典在中国·云南拉开帷幕... -
全球信息:中交地产厦门湖里区项目公司获...
资料显示,厦门兆厦的实际控制人为建发房地产集团有限公司。该公司... -
易维哲:黄金持续走弱,原油可能还有反...
黄金日内走出小幅下跌原油日内基本没什么波幅维持在窄幅震荡中那么... -
指南金师:5.18今日黄金走势分析,美周...
行情回顾国际黄金周三5月17日震荡收跌开盘价199572美元盎司最高价19... -
王杨:黄金空单八连胜,反弹1980继续空...
黄金日内空单两连胜周二美盘开始黄金空单已经八连胜获利收割最近都... -
当前最新:头狼:早盘1983空,目前持仓...
早盘空单收割中今天继续看跌早盘继续单子开路直接在1983跑步进场大... -
长株潭三市已初步形成协调发展的立体交...
ITS头条NEWS“北京市智能交通协会——ITS头条2023年5月17日第763期... -
世界热点!权威解答 | “二阳”是否增...
近日,网络上关于“二阳”的声音引发关注,有报道称部分城市三甲医... -
用了3种降压药,血压还是降不下来?你需...
今天是“世界高血压日”高血压是一种常见的慢性疾病患者早期常无明... -
故宫“数字文物库”再上新2万件,总数超...
故宫博物院举办“‘新’中有数,共‘创’未来——5·18故宫博物院‘... -
5000年光阴浩荡,我们在博物馆看见了什么?
在这里,时间有着不一样的流动速度。一件件静默的文物,凝固着一段... -
34岁文物修复师李小波:以敬畏之心唤醒...
李小波正在修复一件瓷器。(王莉莉摄)央视网消息(记者王莉莉)5月18日... -
古田:人民军队定型铸魂的地方
本期讲师:福建省委党校(行政学院)魏少辉内容提要:在三湾改编、... -
支持提高义务教育质量 中国财政部下拨2...
支持提高义务教育质量中国财政部下拨2270多亿元 -
北京大兴国际机场临空经济区地标性建筑...
2023年5月16日,座落于北京大兴国际机场(廊坊)临空经济区的地标性... -
恒寿堂乌梅子酱果茶火遍全网,依托产品...
自古以来,中医学便有着药食同源的说法,在这种理论看来食物和药物... -
环球消息!交通运输部全力开展“鲁蓬远...
新华社北京5月18日电(记者叶昊鸣)记者18日从交通运输部获悉,交通... -
前4个月全国税收收入同比增长12.9% 国...
央视网消息:我国的财政收入主要来自于税收,2023年前4个月,全国税... -
科幻征文大赛范文(共7篇)
科幻征文大赛范文第1篇风吹起天空中的黄沙,空气的浑浊使人无法呼吸... -
国际金价后市料下探1968美元
讯——周四5月18日国际金价窄幅波动因投资者下调美联储政策宽松预期... -
志特新材(300986)5月18日主力资金净买...
截至2023年5月18日收盘,志特新材(300986)报收于29 61元,上涨0 1... -
那拉陇原乳业荣获美国FDA认证!!走向国...
重磅消息!!!恭贺甘肃那拉陇原乳业有限公司荣获美国FDA权威认证!... -
全球微资讯!大国品牌帅丰【天机3】TJ3-...
“商业成功的秘诀只有一条:讨人喜欢,让人快乐。”——孟德斯鸠在... -
国际金价续承压,短期内受两大利空因素阻击
讯——周四5月18日国际金价继续承压因投资者下调美联储政策宽松预期... -
天天最资讯丨美原油交易策略:两利好提...
讯——周四5月18日亚欧时段美原油窄幅震荡目前交投于7269美元�附近... -
你的押金退了吗? ofo创始人已在美国卖...
中新网5月18日电(中新财经左雨晴)2023年,你还在等待ofo小黄车退还... -
叙媒:美军再次出动40余辆油罐车,在叙...
当地时间5月17日,叙利亚国家电视台援引消息人士的话报道,美军再次... -
曝iPhone 15 相机布局将要大变样,因...
据外媒报道,苹果计划在明年推出iPhone15ProMax,这款手机将采用一... -
当前速看:“祝融号”又有新发现!我国...
近日,中国地质大学(武汉)地球科学学院肖龙教授领导的国际研究团... -
今日99只股长线走稳 站上年线
证券时报•数据宝统计,截至今日下午收盘,上证综指3297 32点,收... -
热门:我国血友病基因治疗取得新进展
新华社天津5月18日电(记者张建新)中国医学科学院血液病医院(中国... -
焦点滚动:中国星辰|“+北斗”应用规模...
央视网消息:5月18日,中国卫星导航定位协会发布《2023中国卫星导航... -
什么叫熊市和牛市?熊市一般会持续多久?
什么叫熊市和牛市?熊市又称空头市场,指证券市场上价格走低的市场。... -
银价跌破重要支撑!白银日内交易分析:...
24K99讯周四5月18日亚市尾盘现货白银维持日内跌势银价目前位于2360... -
万锦晟5.18最新黄金走势分析,黄金莫追...
黄金日线连阴下跌当前到达这一波跌幅的382支撑位1975分水岭1970破位... -
国际博物馆日丨惊艳了!来看古人的这些...
打造时尚感,精致的小单品必不可少。披肩、腰带扣、皮靴、配饰、单... -
90筹码集中度小于10什么意思啊?90筹码...
90筹码集中度小于10什么意思啊?90筹码集中度,表示该股90%的可流通... -
天天速递!金价短线急跌逼近首个目标!...
24K99讯周四5月18日亚市尾盘现货黄金短线快速下跌金价现报1978美元... -
超大单大单中单小单如何区别?大单出小...
超大单大单中单小单如何区别?超大单:成交量大于等于3000手,或者成... -
祝你股市长虹什么意思?长红与长虹有区...
祝你股市长虹什么意思?祝你股市长虹是指祝投资者赚钱的意思,长虹代... -
当前焦点!至纯科技与上海化工区签署投资...
据至纯科技18日消息,5月16日,至纯科技与上海化工区签署投资意向协... -
市价委托与限价委托的区别是什么?市价...
市价委托与限价委托的区别是什么?市价委托和限价委托的区别主要在于... -
持仓市值是什么意思?持仓份额少于本金...
持仓市值是什么意思?所谓持仓市值就是指投资者所持有的股票的市场价... -
头狼:黄金这波空看1950下方-资讯
没有进场的反弹赶紧进场市场准备要一波大跌了而且还是30cm的跌势目... -
天弘a50基金是什么意思?天弘基金自动转...
天弘a50基金是什么意思?天弘a50基金简称天弘国证A50指数,基金代码... -
30秒通关!有望在这里实现|天天速递
香港与内地恢复通关后,跨境往来频繁,便捷过关需求愈趋迫切。 -
长下影线是什么意思?下影线长代表什么?
长下影线是什么意思?长下影线是指下影线的长度远远超过K线实体长度... -
深证和上证股票有什么区别?深证成指包...
深证和上证股票有什么区别?1、板块不同:上证只有主板与B股,深证有... -
买二手房只有房产证没有土地证能过户吗
众所周知,在买房子的时候,很关键的一步就是过户,不过户的话,房... -
尾盘大单卖出什么意思?尾盘大单卖出第...
尾盘大单卖出什么意思?尾盘大单卖出指的是在收盘前有巨额卖单,说明... -
k线和均线的关系是什么?股价离均线太远...
k线和均线的关系是什么?K线是单个周期的价格表现,均线是若干个周期... -
蔓越莓长在哪里?蔓越莓长在水里吗?蔓...
蔓越莓长在哪里?蔓越莓生长在北半球的凉爽地带酸性泥炭土壤中,是非... -
怀来:抵制网络谣言进村入户
2023年5月18日,张家口市怀来县委网信办联合县公安局、县文明办、存...