当前信息:解剖屎山,寻觅黄金之第二弹

2023-05-10 09:02:27 来源: 程序员客栈

大家好,我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);privatefinalMapserviceHolder=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啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。aust

05-10 09:02:27

整活!瓜迪奥拉再次全场零换人 本赛季欧冠第二次

据统计,上一次在欧冠半决赛零换人的是2007年4月24日的曼联,对手是米兰。“皇马的水平很高,在比赛中表现

05-10 08:14:32

我国古代的称呼足下蚂蚁庄园_在我国古代的称呼足下适用于下列哪种情境 新视野

古代人对于称呼是很看重的,那么在我国古代的称呼足下适用于下列哪种情境呢?是同辈相称还是上级对下级的称

05-10 07:08:10

实时焦点:04月23日贺州最新进出管控出入政策规定措施及疫情防控政策最新消息通知通告

当前疫情形势仍然严峻复杂,不可松懈。2023年04月23日贺州最新进出管控出入政策规定措施及疫情防控政策最新

05-10 06:16:34

四级高频词汇及例句大全_四级高频词汇及例句

1、像下面的行么,行的话留一下qq邮箱!!!1 alterv 改变,改动,变更(例)Theseclothesa

05-10 05:50:04

电焰灶原理视频教程_电焰灶原理

1、开放式发热(电磁炉和一代光波炉是封闭式),发热原材料的革新:镍铬金属发热体(德国发热盘),它将电热能

05-10 03:42:06

5月9日基金净值:嘉实环保低碳股票最新净值2.627,跌1.54%-当前速递

5月9日,嘉实环保低碳股票最新单位净值为2 627元,累计净值为2 627元,较前一交易日下跌1 54%。历史数据显

05-10 01:41:13

全球今头条!000738股票近期情,000732股票行情

本文内容是由小编为大家搜集关于000738股票近期情,以及000732股票行情的资料,整理后发布的内容,让我们赶

05-09 22:55:51

抖音电商央视将开启“中国品牌消费节·510国货品牌大赏”直播专场 世界微头条

抖音电商联合中央广播电台央视网于5月4日至5月15日期间推出“中国品牌消费节·510国货品牌大赏”专场活动。

05-09 22:07:01

三部门组织开展2023年“百场万企”大中小企业融通对接活动_世界快看点

记者9日从工信部了解到,工信部、国资委、全国工商联近日联合印发通知,组织开展2023年“百场万企”大中...

05-09 21:26:44

瑞安航空同意采购300架波音737 MAX 10 订单价值400亿美元_当前速读

【瑞安航空同意采购300架波音737MAX10订单价值400亿美元】彭博5月9日消息,瑞安航空9日同意采购300架波音73

05-09 20:45:15

【明日方舟】缪尔赛思想让博士喜欢自己

自上海回来后顶着阳的身体和发烧码出来的文,效果并不好,后续还会再有一篇缪缪,超级加倍,也会把质量提上

05-09 20:05:00

全球快报:PC玩家影响力大涨!动视暴雪PC收入首次超越主机

快科技5月9日消息,近日,动视暴雪公布了2023年第一季度财报,在该季度,其PC游戏的收入首次超越主机游戏。

05-09 19:19:57

电功单位是焦耳还是千瓦时_电功单位 世界今亮点

1、【答案】D【答案解析】试题分析:在国际单位制中伏特(V)为电压的单位;安培(A)为电流的单位;瓦特(

05-09 18:47:41

西门子冰箱解锁_西门子冰箱门事件

一、题文下列句子中,没有语病的一句是[]A 为迅速平息“冰箱门事件”,西门子公司就此向消费者诚恳道歉...

05-09 18:19:09

《原神》皆灭椅骸任务怎么做?忆昔诸途巡历皆灭椅骸图文攻略

原神皆灭椅骸任务怎么做呢?可能很多玩家还不太清楚。下面小编就给大家带来原神忆昔诸途巡历皆灭椅骸图文攻

05-09 17:37:20

焦点关注:工信部等5部门:7月1日起全国禁止生产、进口、销售不符合国六排放标准6b阶段的汽车

财经网汽车5月9日讯,工信部等5部门发布关于实施汽车国六排放标准有关事宜的公告。自2023年7月1日起,全国

05-09 17:26:07

舍得酒业:独立运营沱牌,加速夜郎古融入整体生态 每日热讯

舍得酒业股份有限公司今日发布2022年年度股东大会会议材料。在“公司2022年度董事会工作报告”中,舍得...

05-09 16:45:59

全球看热讯:世界杯预选赛欧洲区B组第二轮西班牙客场2比1险胜格鲁吉亚

世界杯预选赛欧洲区B组第二轮,西班牙客场2比1险胜格鲁吉亚,格鲁吉亚第43分钟先取得进球,西班牙第56分钟

05-09 16:18:15

汽车行业中内窥镜的妙用

在汽车制造及维修行业中,内窥镜的应用越来越广泛。这是因为它具有非常独特的优势,可以帮助制造商和技术人

05-09 16:02:35

大武汉旅游年卡端午节能使用吗?

大武汉旅游年卡端午节能使用吗?答:景区节假日大型特殊活动或其他特殊事件,根据园区相关规定执行。也就是

05-09 15:23:21

海王生物收年报问询函,要求说明应收供应商返利款增加的原因及合理性_环球快播

海王生物收年报问询函,要求说明应收供应商返利款增加的原因及合理性

05-09 14:55:08

买偷来的电动车不知情算不算犯法

一、买偷来的车不知情算不算犯法买偷来的车不知情算不算犯法,需视情况而定:1 如果是按照正常价格范围内买

05-09 14:14:17

外汇市场最新行情走势展望:中国贸易数据喜忧参半 澳元/美元跌破0.6800

5月9日,周二亚市盘中,澳元 美元在0 6775附近保持低位,在周二早些时候的七天来首次单日下跌中,从盘中高

05-09 13:40:19

如何更改默认浏览器手机_如何更改默认浏览器

1、按开始---运行--输入gpedit msc打开组策略,在左边的树状结构中找到用户配置——〉管理模板——〉Windo

05-09 13:02:21

957爆夏季赛大瓜:兮夜有概率去RNG试训 WE将辞去BiuBiu 天天信息

近日解说957在直播间爆料,透露了两条劲爆信息:1、Xiye有可能去RNG试训;2、WE将辞去BiuBiu。

05-09 12:30:13

稀土永磁板块异动拉升|天天快资讯

稀土永磁板块异动拉升,中色股份(000758)涨超8%,中国稀土(000831)涨超5%,中科三环(000970)、银河磁体(300

05-09 12:01:11

贵州:严查医疗卫生领域突出问题-动态焦点

据中央纪委国家监委网站报导,今年以来,贵州省各级纪检监察机关紧盯医疗机构部分医护人员收回扣、红包等群

05-09 11:31:45

岩栎ZS|每日观点

1、岩栎ZS。2、壳斗科栎属岩栎种植物。3、原产于湖北省竹山县。本文到此分享完毕,希望对大家有所帮助。

05-09 11:10:55

世界关注:多家车企4月销量增长

5月8日晚间,多家车企公布4月份销量数据。整体来看,车企销量加速回暖,行业景气度持续修复。其中,长城汽

05-09 10:35:00

【全球聚看点】卫星化学(002648.SZ):2022年度乙烷采购比重增加,平均价格较2021年低

格隆汇5月9日丨有投资者在投资者互动平台向卫星化学002648SZ提问根据22年年报披露公司采购烷烃平均单价为40

05-09 10:15:28

北京挂牌7宗预申请住宅用地,总起始价189.44亿元-当前快播

5月8日,澎湃新闻(www thepaper cn)从北京市规划和自然资源委员会官网获悉,北京土地市场发布7宗商品住宅

05-09 09:40:03

各路网传颈椎病“自救指南”靠谱吗?专家解读来了 当前热议

近年来,颈椎病越来越呈现年轻化趋势,反复发作的疼痛正在压垮这届颈椎脆弱的年轻人,有网友甚至把颈椎病评

05-09 09:13:27

观热点:稳外贸,再加把劲

原标题:稳外贸,再加把劲受多重因素影响,去年以来世界经济和贸易增速放缓。世界贸易组织发布的报告显示,

05-09 09:00:34

【4.26专题•北知法院】你刚刚刷到的视频,可能正在侵权|环球时快讯

来源:知产北京自己辛苦创作的作品被“高仿”,播放量甚至比自己的作品还高,这个时候应该怎么办?自媒...

05-09 08:18:15

预期好转增信心 多方合力拓市场;

预期好转增信心多方合力拓市场;近期,中国机电产品进出口商会等部门对外贸企业的调研显示,企业出口预期明

05-09 07:20:01

莆田鞋贸城哪里买 莆田鞋贸城-世界动态

今天来聊聊关于莆田鞋贸城哪里买,莆田鞋贸城的文章,现在就为大家来简单介绍下莆田鞋贸城哪里买,莆田鞋贸

05-09 06:19:01

焦点快看:腱鞘炎怎么治断根_腱鞘炎怎么治

1、在腱鞘炎早期,可以通过局部休息、局部理疗、热敷等方法口服布洛芬。2、如果持续,建议去医院做进一步检

05-09 04:56:39

天天观速讯丨昌平区政府街城市更新工作将于今年落地实施

人民网北京5月8日电(董兆瑞)5月7日,“街励计划”——昌平城市更新新场景设计竞赛优选作品路演活动举...

05-09 03:00:01

假期补觉 为啥越睡越乏 全球快播报

刚过去的五一小长假,有人出门旅游,还有人选择宅家补觉。如果需要熬夜,应在白天空闲的时候小睡半个小时,

05-09 00:47:10

调查研究设计方案怎么写_简要地设计一个调查研究方案

1、需要经过深入细致的调查后,将调查中收集到的材料加以系统整理。2、社会调查报告要求内容调查的目的、调

05-08 22:59:21

播报:ahc是什么牌子的眼霜_ahc是什么牌子

1、AHC是韩国化妆品集团CarverKorea(珂泊亚)旗下品牌之一,算是一款性价比不错的产品,价格相对许多品牌算便宜

05-08 21:45:44

2023重庆520演出活动大全(时间+地点+门票)-全球头条

2023重庆520演出活动大全时间|5月20日(周六)图源:摄图网_401285751热门演出演出名称时间地点演出详情许

05-08 21:07:00

世界视讯!浙江湖州:急救知识进校园

5月8日是世界红十字日,为了提高学生紧急避险意识和应急救护能力,浙江省湖州市德清县洛舍镇中心学校开展了

05-08 20:26:37

小学3年级作文评语_小学生作文评语三年级_环球观热点

1、作文批改开头评语文章开头简而得当,通过环境描写来衬托人物心情,十分艺术化。2、2、开头简明扼要3、文

05-08 19:46:40

ATFX国际:巴菲特十大重仓股,苹果居首,比亚迪上榜

巴菲特在股东大会上提到“我们现在的浮存金已经有1650亿美元之多,从1986年到现在,已经有非常大,而且让人

05-08 19:13:22

重庆能投健康产业挂牌骏马物业100%股权 转让底价558.17万元|世界报道

观点网讯:5月8日,重庆能投健康产业有限公司挂牌重庆市骏马物业管理有限公司100%股权,转让底价为558 17万

05-08 18:18:57

南向资金今日净买入超18亿港元,中海油净买入居前 今亮点

App5月8日消息,南向资金今日净买入18 21亿港元。港股通(沪)方面,中国海洋石油、中国移动分别获净买入4

05-08 18:00:54

青岛市城市管理局聚焦优化营商环境 创新升级门头招牌前置服务|全球观速讯

沿街商户门头招牌是市容景观环境的重要组成部分,关系城市的外在形象,反映城市的经济活力。

05-08 17:17:32

俄罗斯总统与土库曼斯坦总统通电话 天天快资讯

据俄罗斯卫星通讯社报道,当地时间8日,俄罗斯总统弗拉基米尔·普京与土库曼斯坦总统谢尔达尔·别尔德穆...

05-08 17:10:45

整活!瓜迪奥拉再次全场零换人 本赛季欧冠第二次
我国古代的称呼足下蚂蚁庄园_在我国古代的称呼足下适用于下列哪种情境 新视野
实时焦点:04月23日贺州最新进出管控出入政策规定措施及疫情防控政策最新消息通知通告
四级高频词汇及例句大全_四级高频词汇及例句
电焰灶原理视频教程_电焰灶原理
5月9日基金净值:嘉实环保低碳股票最新净值2.627,跌1.54%-当前速递
全球今头条!000738股票近期情,000732股票行情
抖音电商央视将开启“中国品牌消费节·510国货品牌大赏”直播专场 世界微头条
三部门组织开展2023年“百场万企”大中小企业融通对接活动_世界快看点
瑞安航空同意采购300架波音737 MAX 10 订单价值400亿美元_当前速读
【明日方舟】缪尔赛思想让博士喜欢自己
全球快报:PC玩家影响力大涨!动视暴雪PC收入首次超越主机
电功单位是焦耳还是千瓦时_电功单位 世界今亮点
西门子冰箱解锁_西门子冰箱门事件
《原神》皆灭椅骸任务怎么做?忆昔诸途巡历皆灭椅骸图文攻略
焦点关注:工信部等5部门:7月1日起全国禁止生产、进口、销售不符合国六排放标准6b阶段的汽车
舍得酒业:独立运营沱牌,加速夜郎古融入整体生态 每日热讯
全球看热讯:世界杯预选赛欧洲区B组第二轮西班牙客场2比1险胜格鲁吉亚
汽车行业中内窥镜的妙用
大武汉旅游年卡端午节能使用吗?
海王生物收年报问询函,要求说明应收供应商返利款增加的原因及合理性_环球快播
买偷来的电动车不知情算不算犯法
外汇市场最新行情走势展望:中国贸易数据喜忧参半 澳元/美元跌破0.6800
如何更改默认浏览器手机_如何更改默认浏览器
957爆夏季赛大瓜:兮夜有概率去RNG试训 WE将辞去BiuBiu 天天信息
稀土永磁板块异动拉升|天天快资讯
贵州:严查医疗卫生领域突出问题-动态焦点
岩栎ZS|每日观点
世界关注:多家车企4月销量增长
【全球聚看点】卫星化学(002648.SZ):2022年度乙烷采购比重增加,平均价格较2021年低
北京挂牌7宗预申请住宅用地,总起始价189.44亿元-当前快播
各路网传颈椎病“自救指南”靠谱吗?专家解读来了 当前热议
观热点:稳外贸,再加把劲
【4.26专题•北知法院】你刚刚刷到的视频,可能正在侵权|环球时快讯
预期好转增信心 多方合力拓市场;
莆田鞋贸城哪里买 莆田鞋贸城-世界动态
焦点快看:腱鞘炎怎么治断根_腱鞘炎怎么治
天天观速讯丨昌平区政府街城市更新工作将于今年落地实施
假期补觉 为啥越睡越乏 全球快播报
调查研究设计方案怎么写_简要地设计一个调查研究方案
播报:ahc是什么牌子的眼霜_ahc是什么牌子
2023重庆520演出活动大全(时间+地点+门票)-全球头条
世界视讯!浙江湖州:急救知识进校园
小学3年级作文评语_小学生作文评语三年级_环球观热点
ATFX国际:巴菲特十大重仓股,苹果居首,比亚迪上榜
重庆能投健康产业挂牌骏马物业100%股权 转让底价558.17万元|世界报道
南向资金今日净买入超18亿港元,中海油净买入居前 今亮点
青岛市城市管理局聚焦优化营商环境 创新升级门头招牌前置服务|全球观速讯
俄罗斯总统与土库曼斯坦总统通电话 天天快资讯
一个减少投资判断失误的方法
X 广告
资讯
X 广告

Copyright ©  2015-2022 时代畜牧网版权所有  备案号:   联系邮箱: 514 676 113@qq.com