当前位置: 首页 > 网络应用技术

如何有效实现延迟任务

时间:2023-03-05 22:27:33 网络应用技术

  在业务场景中,有时需要延迟操作:在一定时间段内触发某个行为,可以在等待期间立即执行该行为,或者可以取消固定时间:例如:

  本文将以博客为例,介绍几种常见的延迟任务处理解决方案,包括其他三个常见的支持需求:

  博客表博客的关键字段如下:

  blog_id博客ID

  标题博客标题

  Em

  省略其他字段预期_publish_time期望发布时间

  publish_time实际发布时间

  状态状态1:草稿2:定时版本3:最容易发行的想法是扫描(例如MySQL)。每次使用定时任务扫描博客表,以确定每个博客是否满足触发条件的触发条件。如果是执行相应的发布操作

  扫描条件:

  扫描间隔:1分钟(取决于业务需求的准确性)

  特殊需求支持:

  REDIS使用数据结构ZSET来实现延迟任务。使用分数存储来发布发布时间。会员商店博客ID:

  请注意,您并不是说您将所有数据迁移到Redis,而是只使用Redis来完成手表的清除工作。博客数据仍然存在。

  处理过程如下:

  特殊需求支持:

  与扫描MySQL的表相比,redis zset的数据性能越好,因为它是内存操作,并且ZSET的复杂性使用表面调整时间是O(logn)。性能越好,真实时间越高-Time越高延迟任务的性质

  RocketMQ的开源版本支持18级延迟新闻

  它的内部实施方案是:

  可以看出,RocketMQ还使用旋转查询来实现延迟新闻

  如果延迟时间不在这18个级别上怎么办?您需要额外的处理,例如,您需要延迟5个小时:

  摘要:找到比您在此级别的剩余到期时间少的剩余到期时间的最大值

  如果时间和延迟-Message队列RocketMQ版本-Alibaba Cloud可以在40天内支持延迟,而无需其他业务处理。其他要考虑的点如下:

  业务实施的具体组合比前两个方案更简单,因为它不需要手动维护正时任务:

  在什么情况下会消耗新闻,但博客无法发布?它可能是由以下特殊需求引起的:

  它不支持取消延迟任务功能(开源和阿里巴巴云版本不支持)

  设定时间后,立即发布

  设置时间后,修改发布时间

  设定时间后,取消常规版本

  本文介绍了常见的3 -delay任务解决方案:

  参考文档: