实现延迟队列的几种方案

这篇具有很好参考价值的文章主要介绍了实现延迟队列的几种方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

方案一:基于SpringTask定时扫描数据库

步骤: 把发布的任务和时间保存到数据库中之后使用定时任务SpringTask来进行每五分钟执行一次

优点:可以把任务持久化保存到数据库中,不容易丢失任务

缺点:这种方案发布的时间可能会有误差,因为五分钟才执行一次,如果缩短时间设置一分钟或者几十秒执行一次那么数据库压力非常大,所以这种方案不太理想

方案二 :基于jdk自带DelayQueue

步骤:DelayQueue 延时获取元素阻塞队列,队列根据任务的时间进行排序,使用while true循环不断的尝试从队列中取出任务

优点:这种方案执行速度非常快,因为所有的数据都存在JVM中

而且他的消费任务的时间非常准确

缺点:没有持久化保存当java程序出错了很有可以造成任务数据的丢失,所以这种方案也不太符合

延迟队列的实现方式,java,java-rabbitmq,rabbitmq

方案三:基于rabbitMQ的死信队列

步骤:把消息放到一个队列中(这个队列没有消费者,给消息设置了超时时间TTL),当到了超时时间后变成死信,MQ把死信交给绑定好的死信交换机,由死信交换机在交给目标队列,监听者监听这个目标队列即可

优点:使用简单,mq帮我们管理了整个过程

可以持久化保存,不容易丢失任务

缺点:项目里必须要有rabbitMQ(我们项目中没有MQ所以这个方案也不太符合)

方案四:基于redis的Zset (redis中的Zset是有序不可重复的)

步骤:把延迟任务和时间储存到Zset中,定时扫描Zset取出任务进行消费

优点:这种方案性能好,有一定的持久化的能力,

缺点:这种方案项目里必须有redis

持久化能力不太强,

最终方案:我采用的是rebis和Mysql相结合的方式 MYsql保证了持久化保存

最终方案的总体流程

现将延时任务保存到数据库中,redis中的Zset定时获取数据库中五分钟内要执行的任务,

redis中的list(Redis中的list是双向链表,增删效率高)定时获取Zset中需要立即执行的任务,最后从list中获取任务进行消费文章来源地址https://www.toymoban.com/news/detail-644294.html

到了这里,关于实现延迟队列的几种方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java生成二维码的几种实现方式

    本文将基于Spring Boot介绍两种生成二维码的实现方式,一种是基于Google开发工具包,另一种是基于Hutool来实现; 下面我们将基于Spring Boot,并采用两种方式实现二维码的生成,对于每一种方式还提供两种类型的二维码返回形式,即:物理文件 和 图片响应流 一、基于Google开发

    2024年02月17日
    浏览(44)
  • Java实现字符串排序的几种方式

    创建实体类(此处引入了lombok) 一、使用List集合中自带的sort方法(字符串的位数保持一致,不一致的情况可以在左边补0,也可以使用String.format()方法补全) 1、在对象排序中使用 2、在字符串排序中使用 二、使用Stream流(字符串的位数保持一致,不一致的情况可以在左边补

    2024年02月11日
    浏览(54)
  • 【Java 干货教程】Java实现分页的几种方式详解

    无论是自我学习中,还是在工作中,固然会遇到 与前端搭配实现分页的功能 ,发现有几种方式,特此记录一下。 这种情况也是有的,(根据业务场景且仅仅只能用于 数据量少 的情况)。即后端不做任何数据的限制,直接把全部数据返回给前端,前端通过组件实现分页,筛选等

    2024年02月02日
    浏览(49)
  • java实现调用http请求的几种常见方式

    ------ Oracle中文开发者社区 ------ 如果你想要学习编程,关注本博客,持续获得技术支持,持续获得技术咨询 java开发·企业官方账号 Oracle中国官方账号 Java中国管理部 全网粉丝30万+ 华为云享专家 阿里专家博主 CSDN内容合伙人 CSDN原力计划作者 51CTO专家博主 CSDN博客V账号 毕业于四川

    2024年02月04日
    浏览(56)
  • Java实现HTTP请求的几种方式-HttpURLConnection(一)

    在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。 准备两个项目: 项目A: 服务提供者 项目B:服务消费者 在项目A中

    2024年02月16日
    浏览(45)
  • Java实现HTTP请求的几种方式-CloseableHttpClient(三)

    CloseableHttpClient是在HttpClient的基础上修改更新而来的,这里还涉及到请求头token的设置(请求验证),利用fastjson转换请求或返回结果字符串为json格式,当然上面两种方式也是可以设置请求头token、json的,这里只在下面说明。 基于第一章的测试接口,建立以下程序 创建客户端

    2023年04月20日
    浏览(46)
  • JAVA微服务分布式事务的几种实现方式

    一致性(Consistency) :在分布式系统中所有的数据备份,在同一时刻都保持一致状态,如无法保证状态一致,直接返回错误; 可用性(Availability):在集群中一部分节点故障,也能保证客户端访问系统并得到正确响应,允许一定时间内数据状态不一致; 分区容错性(Partiti

    2024年02月12日
    浏览(51)
  • RabbitMQ实现延迟消息的方式-死信队列、延迟队列和惰性队列

    当一条消息因为一些原因无法被成功消费,那么这这条消息就叫做死信,如果包含死信的队列配置了dead-letter-exchange属性指定了一个交换机,队列中的死信都会投递到这个交换机内,这个交换机就叫死信交换机,死信交换机再绑定一个队列,死信最终会进入到这个存放死信的

    2024年02月19日
    浏览(60)
  • 消息队列-RabbitMQ:延迟队列、rabbitmq 插件方式实现延迟队列、整合SpringBoot

    1、延迟队列概念 延时队列内部是有序的 , 最重要的特性 就体现在它的 延时属性 上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说, 延时队列就是用来存放需要在指定时间被处理的元素的队列。 延迟队列使用场景: 订单在十分钟之内未支付则

    2024年02月22日
    浏览(54)
  • Kafka延迟队列的实现方式

    在现代的分布式系统中,延迟队列是一种常见的解决方案,用于处理具有延迟要求的任务或消息。Apache Kafka是一个高性能、可扩展的分布式消息队列,可以作为延迟队列的基础设施。本文将介绍如何使用Kafka实现延迟队列,并提供详细的Java示例。 延迟队列是一种特殊的消息队

    2024年02月13日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包