解剖屎山,寻觅黄金之第二弹
2023-05-12 19:36:57来源:程序员客栈
大家好,我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服务
关键词:
责任编辑:hnmd004
-
显卡风扇不转了影响大吗?显卡风扇转好还是不转好?
显卡风扇不转了影响大吗?1、风扇转动主要是使显卡散热,如果在显卡工作是达到一定的温度,风扇会自动转起,控制显卡温度,保护显卡。当低于这一
2023-07-07 15:57:38 -
word文件损坏打不开怎么修复?word文件损坏乱码怎么修复?
word文件损坏打不开怎么修复?1 打开Microsoft Word软件,点击文件菜单,选择打开命令。2 找到损坏的Word文件,选中文件后点击打开按钮
2023-07-07 10:51:03 -
0xc0000005错误代码怎么解决?应用程序0xc0000005是什么错误?
0xc0000005错误代码怎么解决?1、首先按下win+r打开运行,输入regedit按下回车。2、随后依次定位到:HKEY_LOCAL_MACHINE SOFTWARE Microsoft
2023-07-07 10:47:09 -
java环境变量配置后不生效什么原因?怎样看java环境变量是否配置成功?
java环境变量配置后不生效什么原因?1 检查系统是否支持java,即查看java的版本。如果没有安装,需要安装java环境。2 检查配置文件是否正确
2023-07-07 10:43:40 -
ios17什么时候可以更新正式版?ios17什么时候正式推送更新?
ios17什么时候可以更新正式版?ios17正式版预计9月可以更新使用,届时和iPhone15系列新机一起到来。目前,ios17 Beta版在WWDC23发布会结束后
2023-07-07 10:40:52 -
Win11打游戏FPS低怎么办?手机玩游戏帧数低怎么办?
Win11打游戏FPS低怎么办?1、进入Win11系统桌面上,点击开始选择设置进入。2、进入设置界面,点击游戏进入。3、在游戏页面,点击游戏模式进
2023-07-07 10:38:03 -
电脑开不了机怎么办按哪个键?电脑开不了机怎么强制开机?
电脑开不了机怎么办按哪个键?F8:进入 Windows 安全模式。F10:进入 BIOS 设置界面。F11:进入系统恢复界面。Del:进入 BIOS 设置界
2023-07-06 11:14:10 -
显卡风扇不转正常吗?显卡风扇不转怎么解决?
显卡风扇不转正常吗?显卡风扇不转是不正常的。1、灰尘过多可能是显卡上的灰尘太多了,导致堵塞,如果长时间不清理的话,显卡的风扇就会因为
2023-07-06 11:02:33 -
windowshello突然不能用怎么办?windows hello在哪里设置?
windowshello突然不能用怎么办?1、首先按下WIN+R,输入 services msc 回车2、在服务列表中查找 Windows Biometric Service 看这个服
2023-07-06 10:53:30 -
不支持已连接的usb设备怎么解决?无法识别的usb设备是什么意思?
不支持已连接的usb设备怎么解决?需要格式化。USB不支持已连接的设备,是因为U盘文件系统要FAT32格式,需要重新设置U盘格式,先格式化U盘,将U盘
2023-07-06 08:45:03 -
打开dwg格式的软件有哪些?dwg格式文件是什么文件?
打开dwg格式的软件有哪些?1、看图纸DwgSeePlus,一款dwg文件浏览器;2、CAD迷你看图,一款小巧的DWG文件浏览小工具;3、CAD迷你画图,一款CAD
2023-07-06 08:42:40 -
电脑突然没声音了是什么原因?电脑突然没声音了怎么解决?
电脑突然没声音了是什么原因?一起跟着小编来看看吧。电脑没有声音的原因是计算机硬件问题和软件问题,硬件问题主要是声卡坏了,或者输出声
2023-07-05 10:24:15 -
amd是哪个国家的品牌?英特尔和amd哪个厉害?
amd是哪个国家的品牌?amd处理器是美国生产的;美国AMD半导体公司专门为计算机、通信和消费电子行业设计和制造各种创新的微处理器,以及提供
2023-07-05 10:21:36 -
tmp文件可以随便删吗?tmp文件删不掉怎么办?
tmp文件可以随便删吗?是的,可以删除。 tmp文件是一种临时文件,它们通常由操作系统或应用程序创建,以存储暂时数据。一旦完成,它们就会被
2023-07-05 10:19:30 -
mkv格式手机可以看吗?苹果不支持mkv视频吗?
mkv格式手机可以看吗?可以的。 MKV并不是一种压缩格式,而是Matroska的一种媒体文件,是一种多媒体封装格式,或叫多媒体容器。 它可将多种不
2023-07-05 10:16:45 -
电脑开机慢特别卡怎么解决?电脑开机慢系统启动慢什么原因?
电脑开机慢特别卡怎么解决?好多小伙伴不知道如何解决的,那小编就把操作方法分享给大家吧,感兴趣的小伙伴可以参考看看哈。方法一: 减少
2023-07-05 10:11:39 -
zip压缩文件怎么绕过密码?已有的压缩包如何添加密码?
zip压缩文件怎么绕过密码?好多小伙伴不知道的,那小编就来给大家解答一下吧,希望可以帮助到大家吧。1、首先在电脑中,启用英文版nsis,2、
2023-07-05 10:07:06 -
文件后缀隐藏了怎么显示出来?怎么让文件显示扩展名?
文件后缀隐藏了怎么显示出来?一起来看看吧。1、首先,双击打开【计算机】,打开计算机磁盘目录,2、打开后,正常菜单栏是没有显示出来,打
2023-07-04 10:01:15 -
php文件的扩展名是什么?怎么修改php上传文件的大小?
php文件的扩展名是什么?php文件后缀名就是 php文件扩展名和标签为了让服务器来确定我们的PHP文件和脚本,我们必须保存的文件以 php结尾。怎
2023-07-04 09:56:02 -
电脑的文件恢复区在哪里找?恢复文件已损坏怎么办?
电脑的文件恢复区在哪里找?1、1 360文件恢复区打开【360安全卫士】→【木马查杀】,找到并单击左下角的【恢复区】,就可以找到360文件
2023-07-04 09:52:57 -
ipad游戏没有声音怎么回事?ipad打游戏没有声音怎么办?
ipad游戏没有声音怎么回事?1、ipad游戏没有声音可能是忘记开声音或者设置了静音,打开声音或者关闭静音。2、ipad上的游戏设置没有启用声音
2023-07-04 09:42:32 -
电脑快捷方式存在问题是什么原因?快捷方式存在问题怎么解决?
电脑快捷方式存在问题是什么原因?Win11电脑快捷方式可能会出现问题,主要是由于系统更新、病毒感染或者其他原因导致的。快捷方式存在问题怎
2023-07-04 09:34:09 -
DAT是什么文件扩展名?bmp是什么文件扩展名?
DAT是什么文件扩展名? dat文件有两种类型:1、VCD的媒体文件,是数据流格式,可以用一般的视频播放器打开,该类型文件也是MPG格式的,是VCD
2023-07-03 09:48:00 -
mp3文件格式不支持怎么办?mp3格式是什么格式?
mp3文件格式不支持怎么办?是不是好多小伙伴遇到这样的问题不知道如何解决的,那小编就把方法分享给大家吧,感兴趣的小伙伴可以参考看看哈。
2023-07-03 09:44:46 -
任务管理器被禁用怎么解除?任务管理器中没有菜单栏如何解决?
任务管理器被禁用怎么解除?好多小伙伴不知道如何解决的,那小编就把方法给大家解答一下吧,希望可以帮助到大家吧。1、开始 运行 gpedit msc
2023-07-03 09:40:26
精彩推荐
阅读排行
最新资讯
- 电脑淘宝联系不了卖家(电脑淘宝怎么联...
- 图卢兹官方:俱乐部确认将参加下赛季欧联杯
- 第一章 第八节 桑
- 新阶段!北京开放自动驾驶车内无人商业...
- 武汉发布第二批拟供地清单 涉及31宗涉宅用地
- 知乎官宣!“匿名”功能下线
- 联络互动:目前正在加快推进北京联络大...
- 特斯拉“二把手”20天套现近千万!
- 财付通回应30亿罚单:坚决服从和落实,...
- 一成首付可买房,深圳涉事楼盘紧急回应→
- 华为云盘古大模型3.0来了!它为何不做中...
- AI创新成果走进应用场:GE医疗中国发布...
- 国家要“动真格”了?催买房无效后,智...
- 平谷一工业用地顺利成交
- 平谷一物流用地顺利成交
- 从“蔚小理”到“理蔚小”:销量差距背...
- 天智航股东拟合计减持不超2%股份
- 美媒:拜登批准向乌克兰提供违禁武器集...
- 海看股份:公司拥有超过9000小时的超清...
- 中国建筑材料联合会到山东玻纤调研指导工作
- 瑞普生物:猫三联疫苗正在新药申报注册...
- 安居房、人才房成为历史?2023深圳保障...
- 科技感仪式感通通拉满的录取通知书!南...
- 协鑫集成:公司目前订单储备充裕
- 西藏昌都发放购房补贴:干部职工300元/...
- 满足哪些条件可以线上办理公积金提取?...
- 30亿!支付宝、财付通收巨额罚单!
- 福建邵武:鼓励工会组织职工团购商品住...
- 新化首例不动产登记“带押过户”业务成...
- 7月7日大公司动向追踪:蚂蚁、腾讯领百...
- “河西人才节”重磅举措 河西区发布人...
- 把长安CS35 PLUS、吉利缤越压着打,202...
- Plog|长沙这个夏天,热!热!热!热!热!
- 广汇物流:拟定增募资不超18亿元
- 招商蛇口上半年销售约1664亿元 近期新...
- 2023年小暑物企最佳官宣海报:上坤物业
- 为控股股东提供关联担保未按规履行决策...
- 北京汽车:“巅峰”对话谋发展 雪域高...
- 川投能源业绩快报:上半年净利润同比增...
- 中原按揭:新措施促进香港楼市健康发展...
- 上半年宝龙地产销售约176亿元,上坤地产...
- 最新!佛山五区地价TOP10地图出炉,禅桂...
- 新赛股份:控股股东筹划公司控制权变更...
- 中国平安董事会审议通过付欣出任公司副...
- 一周法治播报|第77期:深圳发布四个政府...
- 谁让国内顶流足球红人同台齐聚?
- 2023年矿物制品龙头股有哪些?(2023/7/7)
- 华人健康:拟3.47亿元收购江苏神华100%股份
- 公积金利息可以取出来花吗?怎么操作?
- 房价下跌13%,香港放大招了!刺激楼市,...
- 金融管理部门对蚂蚁集团及旗下机构罚款7...
- 国能日新:董事及监事等拟合计减持不超2...
- 搭载全新发动机,蒙迪欧1.5T车型能否满...
- 贵阳银行:董事会秘书董静辞职
- 深网观察 第761期 | 深圳报业食堂摆...
- 时刻半年!连江将再出让2幅地块!位置在...
- 市区这片将拆迁!补偿政策...
- 45天下线1万台,哈弗枭龙要为新能源SUV...
- 瞄准全场景智慧出行,深蓝汽车要解决行...
- 中国石油北京项目管理公司:给予胡继勇...
- 齐翔腾达:子公司青岛思远8万吨/年甲乙...
- 招商银行:王小青副行长任职资格已获得核准
- cpu带k和f和kf(cpu带k的和带kf有何区别)
- 江苏出台临时用地管理规范性文件 明确...
- 2023年重庆市养老金计发补发时间什么时候?
- 产品力再突破,锋兰达要将“高价值”传...
- 通用电气发布可持续发展报告 多途径助...
- 简阳市市场监管局靠前发力 保障大运会...
- 住建部明确城市更新底线要求 坚持“留...
- 华依科技董事拟减持不超1.5%股份
- 《北京数字经济发展报告(2022~2023)》发布
- 链家,其实遇到了重大瓶颈
- 广汇物流:拟向控股股东等定增募资不超1...
- 保利发展上半年销售2368.21亿元 6月份2...
- 4.19公顷!史各庄这个地块“规划方案”...
- 问界M5标准版亮相,赛力斯要推动智慧汽...
- AI创新院正式成立 游族网络全面推进AI...
- 知乎宣布将下线匿名功能
- 大恒科技(600288.SH):以1.74亿元出售两...
- 冰箱保鲜蔬菜是密封好还是透气好?
- 掌趣科技旗下《饥饿鲨:进化》APP存在过...
- 株洲市三个名师工作室落户八中
- 开展危旧房排查 筑牢安全大根基
- 宣亚国际:公司暂未使用高算力、高传输...
- 格力地产:三亚合联中央商务区项目正在...
- 中南建设:公司西安中南上悦城4月底已完...
- 宋城演艺:公司目前已不持有SPACES任何股权
- 泉峰汽车:收到国内某知名通信科技公司...
- 深圳福彩公益微电影《星光》获国家广电...
- 九安医疗:公司已有专门负责糖尿病诊疗...
- 克而瑞:金科引入长城国富作战投,长实...
- 丰山集团:丰山全诺在钒电池液流电解液...
- 咸宁出台新政!事关老旧小区
- 今年首批!老旧小区改造,涉及昌平两个小区
- “和平方舟”号医院船,西太平洋全流程...
- 木头毛刺用什么打磨抛光(木头毛刺用什...
- 在各地大力推动下 保障性租赁住房筹建...
- 370亿风电龙头腰斩了
- 中秋节发红包多少适合女朋友的
- 13天完成100%签约,7天完成100%搬迁,居...
-
越秀地产(00123.HK)发行13.96亿元票据
下一篇2023-05-12 20:19:22
-
有诈骗分子仿冒征信中心骗钱,央行征信中心发声……
上一篇2023-05-12 18:58:44