解剖屎山,寻觅黄金之第二弹

2023-05-11 14:53: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);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-11 14:53:07

环球百事通!谷歌 Pixel Fold 折叠屏手机仅登陆 4 个市场开售,Pixel 7a 将登陆 17 个地区

谷歌PixelFold折叠屏手机仅登陆4个市场开售,Pixel7a将登陆17个地区,在I O2023大会上,谷歌推出了PixelFold

05-11 14:09:42

阿里“6子N孙”冲刺IPO:谁能率先冲线?谁最前途堪忧?

导语:类似的情景,在最近两个月已经出现很多次了。自从张勇在3月底启动阿里成立以来规模最大的组织架构调

05-11 13:31:11

天天视点!iPhone 技术路线曝光,苹果即将拥抱 microLED 屏幕,机圈新潮流要开始了

5月11日消息,来自DigiTimes的报道称,苹果公司计划推出搭载microLED屏幕的iPhone手机,microLED屏幕亮度更

05-11 12:49:59

广发基金:这只明星产品重仓光伏受挫,近半年净值回撤超30%

广发先进制造股票成立于2022年3月,管理人为广发基金。截至2023年5月9日,该基金A类份额近半年净值回撤30 3

05-11 12:22:03

环球讯息:魏子恒_关于魏子恒简述

小伙伴们,你们好,今天小夏来聊聊一篇关于魏子恒,关于魏子恒简述的文章,网友们对这件事情都比较关注,那

05-11 11:40:13

产能逐步释放 回盛生物一季度归母净利同比大增6倍 全球新动态

日前,回盛生物(300871 SZ)发布的2022年年报显示,公司实现营收约10 23亿元,同比增长2 68%,而归母净利

05-11 11:08:20

欧陆通:服务器电源覆盖60w到30kw瓦数段 产品包括风冷、浸没式液冷在内的两大类电源产品及解决方案

每经AI快讯,有投资者在投资者互动平台提问:贵司的服务器电源有哪些高端系列?有铂金和钛金系列吗?欧陆通

05-11 10:48:00

环球关注:陈坤的老婆是舒淇吗_陈坤的老婆

1、陈坤的老婆不是李冰冰,说实话到目前为止谁是陈坤的老婆、陈坤儿子的母亲究竟是谁还是个迷。2、陈坤和李

05-11 10:32:59

世界资讯:失业补助金能领几个月,一个月多少钱?(参考)

失业补助金能领几个月?失业补助金一个月多少钱?下面跟社保网小编一起来看看什么是失业补助金?失业补助金

05-11 10:07:36

即时:伊朗:美国应解决国内侵犯人权问题,避免干涉别国内政

海外网5月11日电据伊朗英语电视台10日报道,伊朗敦促美国关注自身系统性侵犯少数民族权利的行为,避免干涉

05-11 09:37:57

泰国对越南镀铝锌钢板作出第一次反倾销日落复审终裁_全球即时

2023年5月8日,泰国倾销和补贴审查委员会发布公告称,对原产于越南的镀铝锌钢板(参考英语:PaintedHotDipG

05-11 09:21:33

观热点:养河马是一种怎样的体验?!

养河马是一种怎样的体验?!,今天要讲的,就是《动物星球》上的一组介绍家养大型动物的节目,其中包括了养

05-11 08:55:16

农业大数据与智慧农业

农业是国民经济发展的关键基础,同时也是国家安全的重要保障,自古以来,我国对于农业发展就极为重视。但近

05-11 08:19:05

迪哲医药:融资净买入11.65万元,融资余额737.59万元(05-10)

2023年5月10日迪哲医药融资净买入11 65万元,融资余额737 59万元

05-11 07:25:05

明日A股机会早知道 天天快看点

①国家区块链技术创新中心落地,将加速建设超大规模区块链算力集群经科技部批复,由北京微芯区块链与边缘计

05-11 06:29:54

首回合结束!欧冠晋级形势:国米94%几率进决赛 曼城皇马生死决战_每日热文

北京时间5月11日,欧冠半决赛首回合结束,皇马和曼城1-1战平,国米2-0战胜AC米兰,谁能晋级决赛?一周之后

05-11 05:44:07

渴望得到理解的作文_我渴望得到理解12篇作文精华版

《我渴望得到理解》我渴望得到理解作文(一):我渴望理解转载南或度者听引用本文内容请注切明离来源于芝士

05-11 03:59:11

环球今热点:空调除湿原理图解_空调除湿原理

1、除湿机的工作原理:经过风机的工作,把潮湿的空气从进风口吸入,然后呢经过蒸发器把空气中的水分冷凝,

05-11 01:16:54

珠江流域和松花江流域开展2023年防洪调度演练

珠江流域和松花江流域开展2023年防洪调度演练---新华社北京5月10日电(记者刘诗平)水利部10日组织珠江水利

05-10 22:46:06

【全球播资讯】沈阳好的专科学校有哪些_好的专科学校有哪些

1、北京三本首都师范大学科德学院北京化工大学北方学院北京工商大学嘉华学院  专科中国青年政治学院华北

05-10 21:49:15

立夏节气:5月5日-21日生肖鸡凡事不急一时,做事先“做人”!_视讯

这两天,跟朋友一起喝茶的时候。笔者突然发现了一个问题,只要是属鸡的朋友,很容易在茶桌上坐立不安,很喜

05-10 21:19:09

毕业论文参考文献在哪找(大学图书馆操作方法) 当前热门

大概又到了毕业写论文的时候,毕业论文参考文献你知道在哪里找吗,一起来看看吧。

05-10 20:19:24

上海市松江区人民政府与海通证券签署战略合作协议

5月10日,长三角G60科创走廊数字经济赋能先进制造高质量发展大会在上海松江举行。会上,上海市松江区人民政

05-10 19:53:52

定西市与招商银行兰州分行签订战略合作协议

定西市与招商银行兰州分行签订战略合作协议汪尚学倪佳见证签约武和谦主持5月9日下午,定西市与招商银行兰州

05-10 19:13:43

快播:家庭保洁清洗方法(家居清洁方法)

1、去除桐油污渍。可用汽油、煤油或洗涤剂擦洗,也可用豆腐渣擦洗,然后用清水冲洗。2、去除蟹斑。把煮熟的

05-10 18:36:46

质价比之王!真我11 Pro+正式发布,1999元起售

5月10日,科技潮牌真我realme在三亚举办新品发布会,正式推出越级影像旗舰——真我11系列,包括真我11Pro+

05-10 18:11:01

安阳内黄:巡察纾困解难题 为企分忧有担当

河南经济报记者刘海林通讯员甘霖崔利“我们自己都已经忘了这笔农民工工资保证金了,没想到竟然还能连本...

05-10 17:39:24

2023年5月11日停服更新公告

亲爱的镇魂将您好:《镇魂街:天生为王》将于2023年5月11日05:00进行停服维护更新,预计维护时间5小时左右

05-10 17:06:17

工行长治捉马东街支行三举措提升金融服务质效

黄河新闻网长治讯:工行长治捉马东街支行要求坚持“每日晨会必讲服务”,不断强化员工服务理念,真正做...

05-10 16:29:10

全球快资讯:警惕区域教育合作中的作秀现象

近几年来,随着教育改革的不断深化和区域教育均衡发展的推进,区县之间的教育协作合作不仅越来越多,且日渐

05-10 16:06:59

无充值传奇手游排行(找传奇私服)

无充值传奇手游排行,找传奇私服这个很多人还不知道,现在让我们一起来看看吧!1、是武器的名称吗。2、在无

05-10 15:39:05

全球微头条丨一季度广西农产品进出口总额比增超五成

广西新闻网-广西日报南宁讯(记者陈静通讯员李英)5月9日,记者从自治区农业农村厅了解到,今年一季度,广

05-10 15:05:27

世界即时看!永州市黄冈博才学校举行期中考试之星表彰大会

红网时刻新闻5月10日讯(通讯员黄宣)“百尺竿头思更进,策马扬鞭自奋蹄。”为表彰优秀、树立榜样,激励...

05-10 14:46:52

环球观点:《死亡岛2》无法改造武器解决办法

最近很多小伙伴在游玩死亡岛2的时候都出现了无法改装自己武器的情况,其实这个改装武器是需要小伙伴们解锁

05-10 13:56:43

单次季后赛前10战得至少300分100板75助!约基奇成历史第二人 世界快报

今日NBA季后赛西部半决赛天王山之战,掘金在主场以118-102战胜太阳,系列赛比分来到3-2。约基奇20中12,三

05-10 13:22:20

「NBA」76人客场攻下天王山,“绿衫军”为傲慢付出代价

「NBA」76人客场攻下天王山,“绿衫军”为傲慢付出代价,哈登,湖人,nba,天王山,绿衫军,76人队,波士顿凯尔特

05-10 12:54:58

DXO公布华为P60 Pro影像测试成绩,总分156分,位于全球第一名

昨晚,华为在欧洲发布了华为P60系列,同时在发布会宣布华为P60Pro的DXOMARK手机影像评测成绩156分,排在全

05-10 12:15:16

梅兰竹菊金条价格今天多少一克(2023年05月10日)|世界今亮点

金投网提供梅兰竹菊金条价格今天多少一克(2023年05月10日),梅兰竹菊金条价格最新消息(2023年05月10日)

05-10 12:03:20

天天看点:办结婚证需要什么证件?受理结婚登记申请的条件是什么呢?

办理结婚证需要的证件规定在《婚姻登记工作规范》第二十八条第五项、第七项、第八项中:受理结婚登记申请的

05-10 11:37:43

前沿热点:失去城商行“亚军”宝座,上海银行又遭近亿元处罚

依托消费金融、养老金融,上海银行一度被视为行业中的佼佼者,然而这家标杆城商行已逐步失去A股上市城商行

05-10 11:18:16

德赛电池2022年度网上业绩说明会定于2023年05月10日15:00举行

机会报获悉,德赛电池2022年度网上业绩说明会定于2023年05月10日15:00~17:00举行,出席嘉宾为管理层主要成

05-10 10:38:59

工信部:加紧谋划视频产业高质量发展接续政策

4K 8K电视机出货占比超过70%,5G+8K内容自播能力全球领先,超高清内容和渠道不断充实,国产摄像机、采编播

05-10 10:20:21

当前看点!上市房企融资延续好转势头,年内拟直接融资规模超 2100 亿

进入5月份以来,上市房企融资延续好转势头,第一周便先后有中南建设、三湘印象、大名城、西藏城投等企业公

05-10 09:40:53

每日视点!京剧名家赴疆教戏

口传心授、言传身教,一位专家亲身传授一位学员,传习一出折子戏。从本月开始,乌鲁木齐京剧团(新疆京剧团

05-10 09:24:19

今日上市公司重磅新闻全览|世界看点

[01导读][第02页][第03页][第04页]>>下一页导读:1北汽蓝谷3年巨亏172亿仍坚持 "上量 "存隐忧负债率高达82

05-10 09:00:08

【播资讯】记者:梅西目标继续在欧洲征战,至少到2024年美洲杯

记者:梅西目标继续在欧洲征战,至少到2024年美洲杯,美洲杯,在欧洲,里奥梅西,法国足球,德国足球,中国足球,

05-10 08:04:14

盐湖股份:盐湖股份拥有丰富的镁资源 环球最资讯

同花顺金融研究中心5月10日讯,有投资者向盐湖股份提问,董秘你好,请问贵公司提镁的生产线什么时候能投产

05-10 07:30:46

A股头条:利空!多家AI、中字头大牛股宣布减持消息,高位股情绪再被打压?官宣!“史上最严”国六B来了

中国科传大股东拟减持不超过1%,公司股价年内累计最大涨幅超300%;漫步者主要股东张文东及肖敏拟合计减持

05-10 06:39:11

立方差公式如何推导_立方差

1、用公式表达即:a3-b3=(a-b)(a2+ab+b2)。2、立方差公式也是数学中常用公式之一,在高中数学中接

05-10 05:53:58

环球百事通!谷歌 Pixel Fold 折叠屏手机仅登陆 4 个市场开售,Pixel 7a 将登陆 17 个地区
阿里“6子N孙”冲刺IPO:谁能率先冲线?谁最前途堪忧?
天天视点!iPhone 技术路线曝光,苹果即将拥抱 microLED 屏幕,机圈新潮流要开始了
广发基金:这只明星产品重仓光伏受挫,近半年净值回撤超30%
环球讯息:魏子恒_关于魏子恒简述
产能逐步释放 回盛生物一季度归母净利同比大增6倍 全球新动态
欧陆通:服务器电源覆盖60w到30kw瓦数段 产品包括风冷、浸没式液冷在内的两大类电源产品及解决方案
环球关注:陈坤的老婆是舒淇吗_陈坤的老婆
世界资讯:失业补助金能领几个月,一个月多少钱?(参考)
即时:伊朗:美国应解决国内侵犯人权问题,避免干涉别国内政
泰国对越南镀铝锌钢板作出第一次反倾销日落复审终裁_全球即时
观热点:养河马是一种怎样的体验?!
农业大数据与智慧农业
迪哲医药:融资净买入11.65万元,融资余额737.59万元(05-10)
明日A股机会早知道 天天快看点
首回合结束!欧冠晋级形势:国米94%几率进决赛 曼城皇马生死决战_每日热文
渴望得到理解的作文_我渴望得到理解12篇作文精华版
环球今热点:空调除湿原理图解_空调除湿原理
珠江流域和松花江流域开展2023年防洪调度演练
【全球播资讯】沈阳好的专科学校有哪些_好的专科学校有哪些
立夏节气:5月5日-21日生肖鸡凡事不急一时,做事先“做人”!_视讯
毕业论文参考文献在哪找(大学图书馆操作方法) 当前热门
上海市松江区人民政府与海通证券签署战略合作协议
定西市与招商银行兰州分行签订战略合作协议
快播:家庭保洁清洗方法(家居清洁方法)
质价比之王!真我11 Pro+正式发布,1999元起售
安阳内黄:巡察纾困解难题 为企分忧有担当
2023年5月11日停服更新公告
工行长治捉马东街支行三举措提升金融服务质效
全球快资讯:警惕区域教育合作中的作秀现象
无充值传奇手游排行(找传奇私服)
全球微头条丨一季度广西农产品进出口总额比增超五成
世界即时看!永州市黄冈博才学校举行期中考试之星表彰大会
环球观点:《死亡岛2》无法改造武器解决办法
单次季后赛前10战得至少300分100板75助!约基奇成历史第二人 世界快报
「NBA」76人客场攻下天王山,“绿衫军”为傲慢付出代价
DXO公布华为P60 Pro影像测试成绩,总分156分,位于全球第一名
梅兰竹菊金条价格今天多少一克(2023年05月10日)|世界今亮点
天天看点:办结婚证需要什么证件?受理结婚登记申请的条件是什么呢?
前沿热点:失去城商行“亚军”宝座,上海银行又遭近亿元处罚
德赛电池2022年度网上业绩说明会定于2023年05月10日15:00举行
工信部:加紧谋划视频产业高质量发展接续政策
当前看点!上市房企融资延续好转势头,年内拟直接融资规模超 2100 亿
每日视点!京剧名家赴疆教戏
今日上市公司重磅新闻全览|世界看点
【播资讯】记者:梅西目标继续在欧洲征战,至少到2024年美洲杯
盐湖股份:盐湖股份拥有丰富的镁资源 环球最资讯
A股头条:利空!多家AI、中字头大牛股宣布减持消息,高位股情绪再被打压?官宣!“史上最严”国六B来了
立方差公式如何推导_立方差
北京城市规划板块5月9日涨1.35%,城建发展领涨,主力资金净流入3021.93万元
X 广告
行业动态
X 广告

Copyright ©  2015-2022 南非植物网版权所有  备案号:沪ICP备2022005074号-13   联系邮箱:58 55 97 3@qq.com