您现在的位置是:首页 > 编程 > 

架构师如何高效管理1000w+延时任务???(第1讲)

2025-07-25 08:34:45
架构师如何高效管理1000w+延时任务???(第1讲) 《架构师之路:架构设计中的100个知识点》 1.海量延时任务管理什么场景会用到海量延时任务?例如:每天1000W订单,PM要求24小时自动5星好评,就可以用延时任务来进行处理。一般如何怎么实现这类需求?最容易想到的:启动一个定时任务,每小时跑一次,将完成时间超过24小时的未评价订单取出,自动评为5星。这个方法有什么缺点?时效性不够好,如果

架构师如何高效管理1000w+延时任务???(第1讲)

《架构师之路:架构设计中的100个知识点》 1.海量延时任务管理

什么场景会用到海量延时任务?

例如:每天1000W订单,PM要求24小时自动5星好评,就可以用延时任务来进行处理。

一般如何怎么实现这类需求?

最容易想到的:启动一个定时任务,每小时跑一次,将完成时间超过24小时的未评价订单取出,自动评为5星。

这个方法有什么缺点?

时效性不够好,如果每小时跑一次定时任务,最差的情况下,时间误差会达到1小时。

画外音:当然,对于24小时自动好评的场景,1个小时的误差业务可以接受。

缩短定时任务执行周期,例如每秒一次,能解决时效性的问题吗?

时效性能解决,但效率更低了:1秒钟搜索一次全量数据,却只捞出少量(几百个)符合要求的订单。

有什么高效解决延时任务的方法吗?

时间轮

时间轮的基础结构如何?

1. 创建一个下标从0到86400的环形队列(本质是个数组);

2. 数组的每个slot元素,是一个订单id的集合,表示在这一秒钟,订单完成;

画外音:每个Set<oid>里,只有几百个oid。

. 启动一个timer,每隔1s,在环形队列中移动一格,这一格里的Set<oid>,全部设置为5星好评;

订单完成时,oid怎么加入slot?

每当有新订单完成,就将订单id加入当前正在扫描的slot的前一个slot

为什么是前一个slot?

因为前一个slot将在86400秒之后被扫描到。1s扫一格,下一次被扫描到的时候,就是24小时,需要被设置5星好评之时。

如果用户手动评价,怎么将oid从slot中删除呢?

加一个Map<oid, slot-index>,记录订单id对应的slot下标。用户手动评价,就将对应的oid从slot里删除,避免被扫描到触发默认好评。

这个方案有什么优点?

1. 只有一个timer,不耗内存资源;

2. 时间精度高,可以精确到秒,如果想要更精确,增加slot的数量就行了;

. 每个订单只会处理一次,效率高;

4. 每个slot里的集合批量好评,业务处理快。

另外,时间轮是一个通用的方法,Set中可以是任何task,本文的oid是一个最简单的举例。

知其然,知其所以然。

思路比结论更重要。

补充阅读材料:

《A hierarchical timer wheel》

/

文章不长,可扩展阅读。

==全文完==

本文参与 腾讯云自媒体同步曝光计划,分享自。原始发表:2025-01-02,如有侵权请联系 cloudcommunity@tencent 删除管理架构师数组定时任务队列

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1203787.html

相关标签:无
上传时间: 2025-07-24 05:27:39
留言与评论(共有 6 条评论)
本站网友 trd
14分钟前 发表
1个小时的误差业务可以接受
本站网友 狗宝是什么东西
23分钟前 发表
为什么是前一个slot?因为前一个slot将在86400秒之后被扫描到
本站网友 电脑主题win8
18分钟前 发表
就可以用延时任务来进行处理
本站网友 搜索引擎友好
23分钟前 发表
另外
本站网友 左旋肉碱作用
26分钟前 发表
本文的oid是一个最简单的举例