首页 > 资讯 > > 正文

全球今日报丨解剖屎山,寻觅黄金之第二弹

来源:程序员客栈 2023-05-01 09:40:58

大家好,我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服务

x
推荐阅读

全球今日报丨解剖屎山,寻觅黄金之第二弹

2023-05-01 09:40:58

全球热文:内蒙古锡林郭勒盟正镶白旗2023-05-01 07:01发布大风蓝色预警

2023-05-01 08:43:53

天天热文:锐财经丨企业生产经营延续恢复发展态势

2023-05-01 07:58:51

世界头条:阿坝州师范学院 怎么样好不好是几本

2023-05-01 07:17:52

五一假期开局火爆,哪些消费呈现出强劲势头?_天天热点

2023-05-01 06:16:10

天天速递!“五一”玩转黑龙江|春雪再飘雪乡 美成“童话世界”

2023-05-01 04:41:04

每日快报!电信卡为什么显示2g_答案如下

2023-05-01 03:55:07

家里种榆树盆景风水好吗 家里摆放榆树盆景风水好不好

2023-05-01 00:54:55

焦点快播:岛纹长什么样_岛纹是什么样的

2023-04-30 23:01:24

【环球新要闻】武汉蔡甸:移民村“蝶变”农旅融合“新风景”

2023-04-30 21:49:45
相关新闻

全球今日报丨解剖屎山,寻觅黄金之第二弹

2023-05-01 09:40:58

全球热文:内蒙古锡林郭勒盟正镶白旗2023-05-01 07:01发布大风蓝色预警

2023-05-01 08:43:53

天天热文:锐财经丨企业生产经营延续恢复发展态势

2023-05-01 07:58:51

世界头条:阿坝州师范学院 怎么样好不好是几本

2023-05-01 07:17:52

五一假期开局火爆,哪些消费呈现出强劲势头?_天天热点

2023-05-01 06:16:10

天天速递!“五一”玩转黑龙江|春雪再飘雪乡 美成“童话世界”

2023-05-01 04:41:04

每日快报!电信卡为什么显示2g_答案如下

2023-05-01 03:55:07

家里种榆树盆景风水好吗 家里摆放榆树盆景风水好不好

2023-05-01 00:54:55

焦点快播:岛纹长什么样_岛纹是什么样的

2023-04-30 23:01:24

【环球新要闻】武汉蔡甸:移民村“蝶变”农旅融合“新风景”

2023-04-30 21:49:45

11个最佳生活细节

2023-04-30 20:22:11

水清苇绿,到白洋淀感受“雄安热度”|新京报评论

2023-04-30 19:13:16

疯人院歌词创作背景_疯人院歌词 世界快资讯

2023-04-30 18:03:34

【崩坏三/同人】来自弦所振动的涟漪 流浪篇 #1(完)

2023-04-30 17:11:55

环球新动态:孙敬

2023-04-30 15:58:11

天天观点:五一劳动节来临,点赞这位燃气抢修一线的技术“达人”

2023-04-30 15:30:56

你知道红酒一次倒多少才合适吗?

2023-04-30 14:25:27

初一小四门买什么辅导资料好

2023-04-30 13:19:16

【公示】折合7.444亩!澄海某镇这块地将有新调整!

2023-04-30 12:17:58

注意!红山森林动物园今日预约已满 全球看热讯

2023-04-30 11:39:39

路漫漫其修远兮吾将上下而求索的作者 图片_路漫漫其修远兮吾将上下而求索的作者-热闻

2023-04-30 10:44:18

世界新消息丨黑龙江装备制造企业:“大块头”也有大智慧

2023-04-30 09:55:37

破除流量焦虑,用好的广告内容,撬动好的生意 短讯

2023-04-30 09:07:30

广西南宁:多子女家庭住房公积金贷款额度最高提至110万元

2023-04-30 08:17:53

五大白酒巨头一季度谁更醉人:茅台208亿净利居首 汾酒增速领跑

2023-04-30 07:43:28

天天亮点!rthdcpl.exe损坏文件(rthdcpl exe是什么进程)

2023-04-30 06:21:44

精选!石大在线官网_石大在线

2023-04-30 05:04:58

快穿黑化囚禁病娇bl bl快穿黑化病娇有肉

2023-04-30 02:09:42

东安子鸡是什么地方的特色菜_东安子鸡是什么地方的菜

2023-04-29 23:58:26

天天速读:宁德时代又喂出一家IPO,“分飞劳燕”携手共进A股

2023-04-29 22:02:45

环球热点评!上交所:2022年科创板公司营业收入和净利润分别突破万亿和千亿

2023-04-29 21:10:04

环球百事通!本周绿地元宇宙指数G-Meta Index跑输沪深300

2023-04-29 20:06:03

电话的发明者是谁_电话的发明者叫什么-世界焦点

2023-04-29 18:49:34

天天资讯:国家京剧院“春之声”演出季启幕 名家云集好戏连台

2023-04-29 17:58:05

长三角一体化示范区“五五购物节”启动 展现绿色消费新理念

2023-04-29 17:19:53

河北:电力服务全力保障“五一”电动汽车出行高峰

2023-04-29 16:10:17

头条:张家口万全区与以岭药业签署项目合作协议

2023-04-29 15:45:04

雨雪刚过 美国加州遭遇大面积野火|环球微资讯

2023-04-29 14:49:43

5月,这些新规将影响你我生活|全球新要闻

2023-04-29 13:59:48

叙利亚霍姆斯遭以色列空袭,3名平民受伤_聚看点

2023-04-29 13:04:32

蜡烛制作方法和步骤_蜡烛制作方法

2023-04-29 12:45:10

世界观天下!丝绸之路龙头股_丝绸之路龙头股票一览表(4/28)

2023-04-29 11:59:36

天天快播:还得调整!许尔特11投仅3中拿到12分

2023-04-29 11:14:24

演戏的反派,生活中打不到车,逛商场被歧视,这些三人你还熟悉吗|今日热讯

2023-04-29 10:44:13

欧宝安培拉赢得了电力和替代推进车辆的蒙特卡洛拉力赛

2023-04-29 09:53:58

实例解析:在上海退休,累计缴费37年,账户14万,养老金能有多少

2023-04-29 08:56:58

寒武纪2022年营收7.29亿元,2023年一季度实现上市后首次亏损收窄

2023-04-29 08:58:24

世界观速讯丨年内24家上市公司完成更名 业务发展变化为主因

2023-04-29 08:07:46

中国驻日大使:中方将依法严肃处理在华间谍活动 环球速看料

2023-04-29 06:55:18

跨界入局的万达转让所持股份!究竟是真是假?_焦点热讯

2023-04-29 06:00:34

速看:股票行情快报:崧盛股份(301002)4月28日主力资金净卖出140.54万元

2023-04-29 05:07:33

哲学书籍人生必读一本书(关于哲学的书籍)

2023-04-29 03:04:06

谱尼测试(300887)周评:本周跌3.21%,主力资金合计净流出424.37万元|报道

2023-04-29 01:14:47

“惠享书房”上新!坐标惠州市区东江公园

2023-04-28 23:21:17

年报速递|金融街2022年房地产开发业务营收约185亿元 全球头条

2023-04-28 22:32:17

辰安科技:您所提到的相关数据信息请见公司2022年年度报告第36页,您可以在时间方便的时候再看一下

2023-04-28 21:46:42

视讯![路演]山东威达:截至今年一季度末 公司主要产品订单已有所回升

2023-04-28 21:16:04

五大联赛进球、助攻皆上双球员:梅西、内马尔、萨卡、格子在列

2023-04-28 20:25:19

宝马的新超级跑车可能已秘密取消

2023-04-28 19:59:04

全球百事通!骆驼奶粉什么品牌好?喝骆驼奶粉会不会上火

2023-04-28 19:23:19

快讯:面试季,太狠了!!!

2023-04-28 18:47:21

每日速读!高原病ppt_高原病

2023-04-28 18:06:32

每日消息!金巧福铂金多少钱一克(2023年04月28日)参考价格

2023-04-28 17:42:52

“五一”去南漳!一大波优惠已出发……

2023-04-28 17:23:48

oto商业模式是什么_oto是什么意思

2023-04-28 17:09:54

有了技术支撑,江津枳壳品更优!

2023-04-28 16:38:30

观察:弘毅绿创基金安徽行,嵌入区域产业链落地发展

2023-04-28 15:59:06

农业银行房贷提前还贷款的流程 看完这篇个就够了

2023-04-28 15:34:08

人民财评:扩大内需亟待投资发挥关键作用 世界要闻

2023-04-28 15:16:38

泉阳泉(600189):4月28日技术指标出现看涨信号-“红三兵” 世界即时

2023-04-28 14:40:42

全球今亮点!紫燕食品:公司目前暂无实施股权激励计划

2023-04-28 14:09:14

当前热议!休闲游玩好去处!青岛这两个口袋公园开工建设,年底完工

2023-04-28 13:26:12

2025年,湖北暴雨预警将精细化到乡镇街道|看热讯

2023-04-28 12:53:45

中期有一定累库存预期 豆油价格或面临平台整理

2023-04-28 12:06:44

彬州检察:以知识产权保护宣传优化营商法治环境

2023-04-28 11:54:40

焦点热讯:西藏那曲市巴青县发生3.3级地震 震源深度10千米

2023-04-28 11:34:19

永修县气象台发布雷电黄色预警信号【III级/较重】【2023-04-28】

2023-04-28 11:08:12

全球热点评!reach beyond什么意思(beyond什么意思)

2023-04-28 10:52:59

青岛市中心医疗集团发布五一假期就诊需知

2023-04-28 10:11:26

珍酒李渡的失落与尴尬:股价大跌,广告狂烧16亿盈利能力仍承压

2023-04-28 10:06:02

【天天时快讯】赞!登上“最强大脑”舞台 看15岁少年 “学霸养成攻略”

2023-04-28 09:25:08

内蒙古自治区党委组织部官网_内蒙古自治区党委组织部

2023-04-28 08:48:56

灯用有机油_爸爸生日送什么礼物学生自制

2023-04-28 08:07:31

电气设备的外壳应有什么防护措施?A. 无_电气设备的外壳应有什么防护措施

2023-04-28 07:41:26

观察:尼泊尔发放登珠峰许可证数量创新高,专家担心再引“珠峰大堵车”

2023-04-28 06:41:29

美国众议院投票否决从索马里撤军的决议

2023-04-28 06:07:38

世界播报:月经推迟白带增多是怀孕了吗_月经没来白带增多是怎么回事

2023-04-28 04:49:23

孙学东

2023-04-28 03:01:24

外交部:敦促美韩在台湾问题上谨言慎行

2023-04-28 00:51:42

汉网论坛怎么打不开_汉网论坛

2023-04-27 22:48:03

今日热搜:年轻人的第一台性能车 广汽传祺影豹R正式上市 售13.8-15.8万

2023-04-27 22:11:28

《无畏契约》5 月 2 日封测客户端开放下载,推荐 GTX 1050 Ti

2023-04-27 21:22:44

观点:方可仓库管理软件_关于方可仓库管理软件介绍

2023-04-27 20:50:54

*** 次数:9999999 已用完,请联系开发者*** ldquo 人祭 rdquo 是什么样的_环球时快讯

2023-04-27 20:13:21

世界热头条丨山东3月份新发放商业性个人住房贷款平均利率创历史最低

2023-04-27 19:57:40

iOS 17将为苹果软件带来有史以来最大的变化

2023-04-27 19:17:05

全国首批首个“沙戈荒”新能源基地一期项目全容量并网发电

2023-04-27 18:53:07

当前热门:三友化工: 独立董事关于购买资产暨关联交易事项的独立意见

2023-04-27 18:26:04

广州羊城的由来 广州羊城的由来是什么

2023-04-27 17:54:06

雾里微凉此生情9章_雾里微凉此生情

2023-04-27 17:32:42