快消息!解剖屎山,寻觅黄金之第二弹
大家好,我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服务
标签:
上一篇:世界上共有多少款酒?
下一篇:最后一页
- 快消息!解剖屎山,寻觅黄金之第二弹
- 世界上共有多少款酒?
- 男人为什么喜欢偷腥?-微资讯
- 无界利落极窄直屏设计!魅族20低至2899元-焦点快播
- 察素齐_关于察素齐介绍 焦点滚动
- mg高达哪个最值得买_MG高达|环球快消息
- 世界快资讯:黑牌照(关于黑牌照的基本详情介绍)
- 世界看热讯:马上相逢无纸笔凭君传语报平安妙在何处(马上相逢无纸笔凭君传语报平安)
- 天天快看:日本财务官表示外汇市场应平稳波动且反映经济基本面
- 公共基础知识和基本能力赤峰(公共基础知识和基本能力)_全球简讯
- 时隔20多年东蠡湖再迎生态清淤 清淤量约50万立方米,湖底地形将重塑 天天速看料
- 兰州刻葫芦、卓尼洮河石砚……亮相第三届中国工艺美术博览会 环球热议
- 租房马桶漏水要房东分摊水费吗?在济宁买房子首付多少钱?
- 【市州县传真·湟源】农技专家田间把脉 科学指导助高产
- 夏日太适合穿「绿色+白色」了,怎么穿都好看! 热文
- “网上直通车”精准扶持农村电商 全球今热点
- 环球即时看!柔光摄影棚拍摄技巧 柔光摄影棚拍摄技巧和方法
- 中国信通院:编制纸鸢开放人工智能模型许可证 促大模型落地
- 万信达财务负责人黄健辞职陈宽接任2022年公司亏损4994.54万 天天快看
- 618特惠!金士顿(Kingston)64GB U盘DTMC3G2仅需54.9元!
- 报告:可编程央行数字货币将给中小企业金融服务带来深刻变革 实时
- 让少年健康奔跑 天津开展青少年“三姿”筛查_全球时快讯
- 请问微信怎么登录不了怎么解决(微信怎么登陆不上去) 天天动态
- 贝壳“我来教您用手机”五年温暖相伴,久久为功执善而行 全球通讯
- 江山欧派于浙江嘉兴参股成立智装公司,注册资本200万元 今日热搜
- 每日观点:当“科技脸”混进法治剧,撞上天然脸演员
- 超80%高会考生打算申报最近一次评审!你开始准备了吗?
- 每日热门:执掌风云刚刚更新(更新ios7)
- 宇航员呼出二氧化碳制成品有望成为太空食品 速读
- 低烧不退怎么办(由小编来告诉你)_当前热门
- 男童打冰球被教练压伤致残谁担责?培训机构冰场未尽到安全保障义务,赔偿14.7万元
- 全球快资讯丨鹤峰县1-4月环境空气质量综合指数排名全省第一
- 痛心!失联近7个月,她的遗体被发现 全球今日报
- 环球快资讯:招银国际:予瑞科生物-B买入评级 目标价下调至20.96港元
- 当前通讯!延吉市未成年人保护中心开展“奋进新征程 同心护未来” 关爱未成年人系列活动
- 断背山下百合花开什么意思_断臂山下百合花开什么意思
- 调水量近84个西湖!江苏圆满完成年度南水北调任务
- 每日看点!农夫山泉_老板
- 夜市不能“野”生长
- 最新消息:零风险调光护眼屏+2亿像素写真相机,荣耀90系列新机正式发布
- 中秋十一假期有变_中秋假3天变2天
- 代工巨头引入英伟达AI平台,加速智能工厂普及
- 视讯!五台县委副书记、县长贾文柱带队来云海金属开展招商考察活动
- 焦点滚动:四川新闻联播|往返沪蓉 C919今开启常态化商业运行
- 环球速讯:全国多地高温预警:部分地区已超40℃
- 海伦司(09869.HK):5月29日南向资金减持291.06万股|当前快播
- 乌军总司令:击落俄军11枚伊斯坎德尔导弹 时快讯
- 天天最新:17款博瑞18t机油要几升(博瑞18用什么机油?)
- 环球今头条!崔燕萍
- 天天观焦点:小小东石伞 撑起“一片天”
-
观察:出师不利,吴易昺、商竣程无缘法网第二轮
北京时间5月29日,法网首轮比赛继续进行,在男单比赛中,中国选手吴易昺、商竣程接连不敌各自对手,止步首
-
「聚焦2023中关村论坛」全球青年科技创业论坛举行-热头条
多彩贵州网讯(本网记者张鸿杰)5月28日,以“设计未来·创造时代”为主题的2023中关村论坛——全球青年科...
-
报名ChinaJoy中外参展企业已近500家 外资企业占比30%
5月29日电,今日,顺网科技副总裁、上海汉威信恒展览有限公司董事长韩志海接受财联社记者专访时表示,目前
-
当前消息!福建启动防台风Ⅳ级应急响应
中新网福州5月29日电(记者龙敏)今年第2号台风“玛娃”29日8时中心位于台湾省花莲市东南方大约730公里的...
-
热议:杭州桐庐,商场里刮起健美风暴
5月28日,2023年桐庐第六届健美健身锦标赛在桐庐银泰城举行。在商场里举办这样大型的健美比赛,桐庐还是头
-
环球讯息:2023年5月29日山东省白油价格最新行情预测
中国报告大厅2023年5月29日山东省白油价格最新走势监测显示:济南卓越化工科技有限公司报价机构,今日白油
-
【时快讯】《熟年》倪伟民为何心疼吴二琥?
熟年总体评分2022 他知道吴二琥跟着自己的日子受罪了。这边,听到倪伟强否认出轨,倪伟民一点想不通这么好的
-
5月29日山西高平能源糠醛报价平稳-时快讯
2023年5月29日,山西省高平化工有限公司糠醛(国标,工业级,散水)出厂报价7800元 吨。
-
焦点速递!多项数据反映我国经济运行向好态势明显
近日,多项经济数据发布,数据显示,我国经济运行向好态势明显。国家税务总局数据显示,今年1—4月,全...
-
司法救助如何保护未成年人权益?他们这样做 今日观点
原标题:司法救助如何保护未成年人权益?他们这样做→今天(5月29日),最高人民法院和全国妇联联合召开新
-
世界新资讯:金乡县鸡黍镇团委开展集体生日会暨亲子阅读活动
活动现场大众网见习记者林智通通讯员孙梦浩济宁报道5月29日,济宁市金乡县鸡黍镇团委联合鸡黍镇妇联、鸡黍
-
全球热点评!动力电池产业链
目前市场主流的动力电池可以分为三元锂电池和磷酸铁锂电池。动力电池的上游提供金属锂、石墨等原材料;中游
-
中船系崛起,中国船舶涨超4%_精选
中船系崛起,中国船舶涨超4%
-
神舟十六号将于30日9时31分发射|聚看点
据中国载人航天工程办公室消息,神舟十六号瞄准5月30日9时31分发射。 景海鹏、朱杨柱、桂海潮3名航天员
-
履行使命 捍卫和平(环球走笔)
5月29日是国际维和人员日。此时,我正与中国第二十一批赴黎巴嫩维和部队的战友一道,在复杂环境下开展扫雷
-
齐齐哈尔市4县区加入“肉牛一链跨域办”通办联盟
近日,“肉牛一链跨域办”通办联盟第二期线上签约仪式举行,齐齐哈尔市梅里斯达斡尔族区、富裕县、甘南...
-
顺网科技:业绩优异、电竞酒店风头正盛,AI技术应用落地,将参加ChinaJoy展会 今日要闻
结合最新信息,顺网科技(300113)的股价上涨原因主要有以下几点:业绩表现优异:公司2023年第一季度实现营业
-
河北正定:“强雁带飞”激发乡村振兴新动能_天天简讯
产业振兴是乡村振兴的重中之重。连年来,河北省石家庄市正定县将“半城郊”型经济作为发展的总抓手,积...
-
山姆回应同款蛋糕上海、杭州差价大
据界面新闻,近日,有网友在社交平台上发帖“同样的蛋糕杭州比上海贵这么多”,内容为在山姆超市app内,...
-
2023兔年30克银币价格(2023年05月29日)
金投白银网提供2023兔年30克银币价格(2023年05月29日),30克兔年纪念银币最新消息(2023年05月29日)。
-
环球观速讯丨深化产教融合,创新人才培养模式 当前快讯_今日播报
(相关资料图)日前,京东物流教育公布,江苏农牧科技职业学院京东农商产业学院经过项目申报、项目初评、项目
-
《科技成果赋智中小企业专项行动(2023—2025年)》政策解读|焦点快看
5月25日,工业和信息化部官网公布,工业和信息化部、国家发展和改革委员会、教育部等十部门近日联合印发《
-
太阳转身 凤凰出山 | 首届云南墨江景星凤凰山古茶节香飘四方
现代普洱茶复兴以来,景星茶凭借良好的生态环境、出色的茶叶品质,越来越受到市场的追捧,并抚育出了一批以
-
天天微动态丨知名女演员突然自曝!医生提醒
日前44岁演员陈乔恩在社交平台上发文称自己“老花眼”了还晒出了自己人生中的第一副老花镜随后 陈乔恩...
-
云里物里(872374)230万股限售股将于5月29日解禁上市,占总股本2.82% 今亮点
根据市场公开信息整理,云里物里(872374)于5月29日将有230 0万股限售股份解禁上市,为公司公开发行战略配
-
董会_关于董会的简介
音频解说1、董会,女,1963年生,硕士,高级实验师。从事昆虫学科实验教学与管理工作。 本文关于董会的简
-
深房中协:“买房负首付”违反国家相关金融信贷政策|焦点快看
观点网讯:5月26日,深圳市房地产中介协会在官网发布《关于禁止参与 协助“买房负首付”“零首付”等违...
-
持续至12月底!石景山消防开展“两个通道”专项整治工作
为进一步加强社会面火灾防控工作,全力畅通百姓“救命路”,日前,石景山区消防救援支队启动了“两个通...
-
如何在Ubuntu和Linux Mint上安装Digikam 8.0.0
本文将向您介绍如何在Ubuntu和LinuxMint上安装Digikam8 0 0。Digikam简介如果您是Linux用户和照片爱好者,
-
108平将家与旅途的憧憬结合,全屋的绿植让空间充满自然气息
业主是一对刚结婚的小夫妻,女主崇尚清新自然,男主喜欢看书及旅行,设计师根据业主需求将原有的客厅概念打
-
研究团队揭示了太阳喷发的重构过程|速读
近日,由中国科学院中国科学技术大学(USTC)苟燕宇教授领导的研究小组发现,太阳突出结构在早期爆发期间经历
-
世界关注:如何从种子中种植耐寒芙蓉
耐寒的芙蓉花直径可达12英寸。温带花卉因育种技术而长出多种颜色,但它们最初只有红色、白色和粉红色。从种
-
平谷工会党员干部街头倡导文明礼让
本报讯(记者马超)近日,平谷区总工会党支部积极开展“文明驾车、礼让行人”志愿服务活动。活动中,该...
-
复星医药(02196.HK):获得复星高科技质押6710万股A股股份
来源:格隆汇格隆汇5月28日丨复星医药(02196 HK)公告,公司于2023年5月26日接到控股股东上海复星高科技(集
-
【天天报资讯】队记:有球队相信4号签是不错选择 猛龙已打电话向火箭咨询
据TheAthletic火箭队记KellyIko报道,有些球队仍然相信四号顺位是一个不错的选择,猛龙已经为此打电话咨询
-
全球快讯:郝蕾比孙俪更漂亮?孙俪随便一点就不是郝蕾能够相比的
其实邓超只是和冯静传出绯闻并没有真正在一起,没过多久邓超便是碰到了孙俪,两人一见钟情,表示都很看好对
-
比尔·盖茨27岁长女罕见秀身材!穿皮肤裙看霉霉,学霸辣妈很自信-视讯
当地时间5月27日,詹妮弗·盖茨在社交媒体上分享了一张美照,呈现出了与以往很是不同的风格,真是够罕见...
-
环球速看:武汉市财政局公开向259家单位催收借款!总金额超1亿元
5月28日,南都记者获悉,武汉市财政局、武汉长江资产经营管理有限公司日前在《长江日报》发布一整个版面的
-
等待中!斯玛特谈掘金:他们有机会休息 那是他们得到的奖励
东部决赛G6,凯尔特人104-103险胜热火,大比分3-3战平。赛后,斯玛特接受了采访。被问到抢七主场的氛围时,
-
18种新书速递 | 2023年第14期 消息
本书含有152张图片,再现了当时的自然景观和人文景观,是我们了解古代西域以及20世纪新疆英国探险活动不可
-
新洲一中阳逻校区录取分数线_新洲一中阳逻校区|全球热讯
1、阳逻校区好些吧。2、因为他地处阳逻边郊,方便封闭式管理,对于一些不自觉却又想学好的同学蛮好,管理严
-
印台区气象台继续发布大雾黄色预警【Ⅲ级/较重】【2023-05-28】
印台区气象台2023年05月28日09时12分继续发布大雾黄色预警信号:预计下述地区未来12小时内将出现能见度小于
-
午餐食谱大全及做法简单点(午餐食谱大全及做法)_当前报道
诸多的对于午餐食谱大全及做法简单点,午餐食谱大全及做法这个问题都颇为感兴趣的,为大家梳理了下
-
3-2后!意甲争四仅剩1悬念:国米锁定前4,罗马无缘,米兰差1分
本轮意甲,国米主场迎战亚特兰大,他们只要拿到1分,就将提前1轮锁定前四,结果国米3-2击败对手,顺利确保
-
天天热点评!【独家焦点】原创组图丨在海边赏晚霞,喝椰子水打边炉 海口市民生活好生惬意
(相关资料图)新海南客户端、南海网、南国都市报5月26日消息(记者刘孙谋)5月26日下午6时,在海口市栖海岸
-
在学校里种水稻?
和平区中心小学开辟稻蟹共生池,扎实做好学生劳动教育,提升学生综合素质。5月23日,在天津农业大学水稻专
-
每日头条!松树的诗句古诗 与松树有关的诗句
今天来聊聊关于松树的诗句古诗,与松树有关的诗句的文章,现在就为大家来简单介绍下松树的诗句古诗,与松树
-
找工作要小心“求职陷阱” 警方提示:警惕套路与骗局-观热点
央视网消息:在高校毕业生即将走向职场之际,警方日前发布提示,提醒毕业生要小心“求职陷阱”,警惕套...
-
慢姑娘轰趴馆官网_李丽莎世界杯 环球微资讯
1、什么“和李丽莎怕世界杯的是谁”?延伸:国际足联世界杯(FIFAWorldCup)简称“世界杯”,是世界上最高荣
-
“新”光闪耀 竞绽芳华——北湖区举办第三届新教师素养大赛决赛
红网时刻新闻5月27日讯(通讯员龙露邓仁刚)为深入贯彻党的二十大精神,全面落实新时代教师队伍建设,5月26
X 关闭
X 关闭