超时功能的设计
产品需求
有一个产品需求,需要执行某个动作之后,需要生成一个超时的任务,在超时时间到了之后执行后续的动作,后续动作的执行大约耗时1秒钟。
任务允许在未到超时间删除,超时时间不超过30天。要求在现有的产品架构上实现此功能。
产品架构
- 分布式服务实例数量:3
- 缓存:redis 3.2.3
- 数据库:mysql 5.7
- 消息队列:rabbitMq 3.7.6
- 分布式定时任务:elastic-job 2.1.5
功能设计
-
方案一
首先看到这个需求,第一时间想到的就是在内存中维护一个集合,然后通过定时任务每分钟扫描集合,将到过期时间的任务取出并执行后续的操作。
删除任务则直接将集合中的任务删除。
- 优点:
- 代码逻辑实现简单。
- 充分利用了所有实例,每个实例指需要负责自己内存中的任务即可。
- 存在问题:
- 每次全量扫描集合过于浪费cpu性能,比如许多任务远还未到过期时间的任务。优化方案:采用有序集合,每次只需要扫
- 优点: