大家好,我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啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。aust
04-26 15:53:59
近日,浦东新区第二期“非中医类别人员中医药知识与技能培训”开班,至此,全区预防保健人员全部参加了...
04-26 15:07:06
4月26日消息,比亚迪智利分公司与智利生产促进委员会(CORFO)就锂电池材料生产达成协议,宣布比亚迪在智利
04-26 14:52:17
2023年一季度宁夏各市GDP排行榜银川排名第一吴忠排名第二
04-26 14:15:40
对于4月车市的整体表现,全国乘联会秘书长崔东树预计,4月零售、批发市场均有望实现同比较强增长。未经第一
04-26 13:53:47
有退休金可以申请五保户吗?低保户又是什么?随社保网小编来看看。这是不能的的,不符合条件的。所谓的五保
04-26 13:04:58
新海南客户端、南海网、南国都市报4月26日消息(记者王小畅通讯员陈可瑞)记者从海南铁路海口车务段获悉,
04-26 12:36:46
直播吧4月25日讯上周,执法西班牙U19联赛的主裁判安东尼奥-波佐赛后在球场外遭遇围殴,为此裁判委员会已经
04-26 11:49:52
1、右手拇指麻木是因为支配右手拇指的感觉神经出了问题。这种情况属于周围神经病变,最常见的原因是神经被
04-26 11:54:53
南阳武侯祠门票价格及优惠政策门票:50元 人一、半价票(1)18周岁以下(不含18周岁)未成年人凭身份证件享受半
04-26 11:30:26
4月25日,“湖南省科技创新成果路演”在长沙宣布启动。同日,该活动进行了首轮路演,100余项高质量科技...
04-26 11:03:35
阳光讯(记者杨小娟)4月18日至21日,大雁塔小学西沣分校开展了校级教学能手展示活动。大雁塔小学西沣分校
04-26 10:50:47
4月26日,大新银行经济研究及投资策略部表示,香港3月整体出口按年跌幅显着收窄至1 5%,是去年中以来最小跌
04-26 10:17:03
1、刘邦在战胜项羽后,成了汉朝的开国皇帝。2、这当然使他兴奋、欢乐、踌躇满志,但在内心深处却隐藏着深刻
04-26 09:45:33
昨日早盘期间贸易市场中小牌贴水再度扩大至1000元 吨,市场中部分贸易企业的交割品牌锡锭也处于小幅贴
04-26 09:34:33
银河战舰皇家马德里作为西甲的卫冕冠军,本赛季联赛表现不佳,早早就被死敌巴塞罗那甩在身后,前三十轮战罢
04-26 09:04:31
图虫创意 供图证券时报记者严翠2023年,ChatGPT(微软投资的OpenAI公司研发的聊天机器人)“横空出世”,其
04-26 08:32:46
欢迎观看本篇文章,小柴来为大家解答以上问题。微信朋友圈可以看访客记录吗,微信朋友圈怎么看访客记录很多
04-26 08:01:10
从出口“新三样”、消费“新业态”、投资“新项目”相关数据来看,经济企稳回升态势延续。专家认为,受...
04-26 06:53:31
本报讯“前些年我注册公司,需要来回跑好几个部门,最快也得两三天才能办好,现在到家门口的银行网点就...
04-26 05:57:31
万年县气象台更新大雾橙色预警信号【II级 严重】【2023-04-26】
04-26 05:04:05
今天来聊聊关于正楷字28个基本笔画写法,正楷字的文章,现在就为大家来简单介绍下正楷字28个基本笔画写法,
04-26 03:10:21
1、婚姻法用于处理夫妻家庭关系,子女抚养关系,感情破裂离婚时必用2、继承法用于老人去世后遗产的分配与继
04-26 01:43:56
里昂发布研究报告称,重申福莱特玻璃(06865)“买入”评级,目标价由28 7港元下调至27 7港元。公司首季利
04-26 00:01:26
1、神奇动物格林德沃云资源已保存个人百度网盘。本文到此分享完毕,希望对大家有所帮助。
04-25 23:05:05
【环球时报驻菲律宾特约记者 肖岩】“尽管菲律宾总统马科斯不忘强调‘美国可以进入的菲军事基地不会被...
04-25 22:12:10
国内首家中文网络媒体、79家中央新闻网站之一。内容涵盖国家公派留学、自费出国留学、国际教育、教育科技人
04-25 21:42:42
1、没死呢。2、他只是不喜欢被催稿而且老了所以不画了。3、不过之前在龙珠的周年庆上他又执笔画了龙珠的全
04-25 21:00:38
今天来聊聊关于公司财务制度,公司财务的文章,现在就为大家来简单介绍下公司财务制度,公司财务,希望对各
04-25 20:03:59
精品VIP投研内容
04-25 19:46:13
4月25日,上海期货交易所(下称上期所)、上海国际能源交易中心(下称上期能源)与山东京博石油化工有限公
04-25 19:02:15
原标题:网上出现“专升本”试卷照片?江西教育考试院:未发现试题外泄等情况央视网消息:据江西省教育...
04-25 18:28:55
2023年4月25日星期二,全国自然资源和不动产确权登记召开工作会议,会上自然资源部部长王广华表示我国全面
04-25 18:02:33
目前国内黄金价格查询(2023年4月25日)
04-25 17:35:03
非东莞户籍的可以申请东莞谢岗银屏公租房么?答:可以的,非户籍满足下面的条件可以申请。一、新就业无房职
04-25 17:13:46
为迎接第28个世界读书日,进一步倡导“书籍是人类进步的阶梯”的社会氛围,推进“书香务税”建设,4月23...
04-25 16:43:28
1、一、从审计报告的标准来划分,审计报告分为标准审计报告和非标准审计报告。2、二、从审计报告的意见类型
04-25 16:16:35
风华高科4月25日在互动平台表示,公司祥和项目三期建设已于今年3月启动试生产,目前正在抓紧推进项目建设,
04-25 16:04:47
本报讯(记者苏怡)4月18日,记者从省财政厅获悉:为打造一流的政府采购营商环境,近期该厅印发《关于进一
04-25 15:30:09
截至今年3月底,定西市注册登记各类市场主体211898户,同比增长10 4%。
04-25 15:06:13
基金行业有句老话,“公募的终点是私募”。私募基金行业相对自由和灵活,投资策略也更加多样化,因此能...
04-25 14:24:51
最新消息——4月25日上午,潮新闻记者从京杭运河杭州段建北桥水域船舶沉没事故现场了解到,事故货船已被...
04-25 14:12:21
拥有50余年品牌经验的Swisse斯维诗早早躬身入局,打造了进口药房级高端营养健康品牌SwissePLUS,并推出两款
04-25 13:59:21
你们好,最近小活发现有诸多的小伙伴们对于雅思,雅思和托福的区别这个问题都颇为感兴趣的,今天小活为大家
04-25 13:44:54
秦皇岛心理咨询师报考条件要求,秦皇岛市海港区、山海关区、北戴河区、抚宁区、青龙满族自治县、昌黎县、卢
04-25 13:21:04
阿莱德(301419)04月25日在投资者关系平台上答复了投资者关心的问题。
04-25 12:55:41
甘州融媒讯为做好2023年残疾人基本服务状况与需求信息数据动态更新工作,进一步建立健全残疾人基础数据,全
04-25 12:27:47
近日,由D10RAMA开发并发行的Steam“特别好评”的免费游戏《下雨把人分隔(雨にして人を外れ)》即将添...
04-25 12:12:41
V观财报|*ST商城及董事长、董秘被警示:未及时披露诉讼进展,董秘,诉讼,证监局,上交所,中信银行,*st商城,上
04-25 12:03:37
为进一步加强综合应急救援队伍建设,提升应急救援队伍矿山应急救援技能和现场处置能力,近日,泌阳应急管理
04-25 12:18:08
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。aust
2023-04-26
近日,浦东新区第二期“非中医类别人员中医药知识与技能培训”开班,至此,全区预防保健人员全部参加了...
2023-04-26
4月26日消息,比亚迪智利分公司与智利生产促进委员会(CORFO)就锂电池材料生产达成协议,宣布比亚迪在智利
2023-04-26
2023年一季度宁夏各市GDP排行榜银川排名第一吴忠排名第二
2023-04-26
对于4月车市的整体表现,全国乘联会秘书长崔东树预计,4月零售、批发市场均有望实现同比较强增长。未经第一
2023-04-26
日前从邢台市新闻办举办的南宫专场新闻发布会获悉,今年以来,南宫市坚持外引内育,大力开展招商引资,...
近日,从海带中制造环保纱线的材料创新者AlgiKnit宣布获得1300万美元(8735 6万元)的A轮融资,以通过加...
概念特点1、 定义:纤维是天然或人工合成的细丝状物质,纺织纤维则是指用来纺织布的纤维。2、 纺织纤...
中新网西宁11月21日电 题:青海水润高原:从“大动脉”到“毛细血管”的精准管理 作者 谈林明...
中新网西宁11月21日电 (记者 张添福)青海省卫生健康委员会21日消息,该省第3例本土确诊病例经过20...
Copyright © 2015-2022 欧洲纤维网版权所有 备案号:沪ICP备2022005074号-23 联系邮箱: 58 55 97 3@qq.com