iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >RabbitMQ消息队列怎么实现延迟任务
  • 362
分享到

RabbitMQ消息队列怎么实现延迟任务

2023-06-29 20:06:05 362人浏览 安东尼
摘要

这篇文章主要介绍“RabbitMQ消息队列怎么实现延迟任务”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“RabbitMQ消息队列怎么实现延迟任务”文章能帮助大家解决问题。一、序言延迟任务应用广泛,延

这篇文章主要介绍“RabbitMQ消息队列怎么实现延迟任务”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“RabbitMQ消息队列怎么实现延迟任务”文章能帮助大家解决问题。

一、序言

延迟任务应用广泛,延迟任务典型应用场景有订单超时自动取消;支付回调重试。其中订单超时取消具有幂等性属性,无需考虑重复消费问题;支付回调重试需要考虑重复消费问题。

延迟任务具有如下特点:在未来的某个时间点执行;一般仅执行一次。

1、实现原理

生产者将带有延迟信息的消息发送到RabbitMQ交换机中,等待延迟时间结束方将消息转发到绑定的队列中,消费者通过监听队列消费消息。延迟任务的关键在消息在交换机中停留。

显而易见,基于RabbitMQ实现延迟任务对服务器的可靠性要求极高,交换机内部消息无持久化机制,比如单机模式服务重启,未开始的延迟任务均丢失。

2、组件选型

RabbitMQ消息队列怎么实现延迟任务

二、方案设计

(一)服务器

RabbitMQ服务需要安装x-delayed-message插件以处理延迟消息。

(二)生产者

延迟任务的实现对生产者的要求是将消息可靠的投递到交换机,因此使用confirm确认机制即可。

订单生成之后,先入库,然后以订单ID为key将订单详情存入Redis中(持久化),向RabbitMQ发送异步confirm确定请求。如果收到正常投递返回,则删除Redis中订单ID为key的数据,回收内存,否则以订单ID为key,从Redis中查询出订单数据,重新发送。

RabbitMQ消息队列怎么实现延迟任务

(三)消费者

延迟任务的实现对消费者的要求是以信息不丢失的方式消费消息,具体表现在:手动确认消息的消费,防止消息丢失;消费端持续稳定,防止消息堆积;消息消费失败有重试机制。

考虑到订单延迟取消属于幂等性操作,因此无需考虑消息的重复消费问题。

三、SpringBoot实现

实现部分仅贴一部分核心源码,完整项目请访问GitHub

(一)生产者

考虑到下单是极为重要的操作,因此首先将订单落库、存盘,然后进行后续操作。

for (long i = 1; i <= 10; i++) {        BuOrder order = createOrder(i);        orderService.removeById(order);    orderService.saveOrUpdate(order);        RedisUtils.setObject(RabbitTemplateConfig.ORDER_PREFIX + i, order);        rabbitTemplate.convertAndSend(RabbitmqConfig.DELAY_EXCHANGE_NAME, RabbitmqConfig.DELAY_KEY, order, RabbitUtils.setDelay(30000), RabbitUtils.correlationData(order.getOrderId()));}

生产者可靠投递消息

public void confirm(CorrelationData correlationData, boolean ack, String cause) {    if (correlationData == null) {        return;    }    String key = ORDER_PREFIX + correlationData.getId();    if (ack) {                RedisUtils.deleteObject(key);    } else {                BuOrder order = RedisUtils.getObject(key, BuOrder.class);                rabbitTemplate.convertAndSend(RabbitmqConfig.DELAY_EXCHANGE_NAME, RabbitmqConfig.DELAY_KEY, order, RabbitUtils.setDelay(30000), RabbitUtils.correlationData(order.getOrderId()));    }}

(二)消费者

消费者端手动确认,避免消息丢失;失败自动重试。

@RabbitListener(queues = RabbitmqConfig.DELAY_QUEUE_NAME)public void consumenode01(Channel channel, Message message, BuOrder order) throws IOException {    if (Objects.equals(0, order.getOrderStatus())) {                orderService.updateById(new BuOrder(order.getOrderId(), -1));        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);        log.info(String.fORMat("消费者节点01消费编号为【%s】的消息", order.getOrderId()));    }}

消费者可靠消费应至少开启两个及以上应用,确保消息队列中不积压消息。

(三)通用工具

上述代码涉及一个工具类RabbitUtils,存在于如下依赖中,主要封装RabbitMQ极常用的工具方法。

<dependency>  <groupId>xin.altitude.cms</groupId>  <artifactId>ucode-cms-common</artifactId>  <version>1.4.3.1</version></dependency>

关于“RabbitMQ消息队列怎么实现延迟任务”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: RabbitMQ消息队列怎么实现延迟任务

本文链接: https://www.lsjlt.com/news/326280.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • RabbitMQ消息队列怎么实现延迟任务
    这篇文章主要介绍“RabbitMQ消息队列怎么实现延迟任务”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“RabbitMQ消息队列怎么实现延迟任务”文章能帮助大家解决问题。一、序言延迟任务应用广泛,延...
    99+
    2023-06-29
  • RabbitMQ消息队列实现延迟任务示例
    目录一、序言1、实现原理2、组件选型二、方案设计(一)服务器(二)生产者(三)消费者三、SpringBoot实现(一)生产者(二)消费者(三)通用工具包一、序言 延迟任务应用广泛,延...
    99+
    2022-11-13
  • PHP怎么实现RabbitMQ消息列队
    这篇“PHP怎么实现RabbitMQ消息列队”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP怎么实现RabbitMQ消息...
    99+
    2023-06-30
  • Redis中如何实现消息队列和延时消息队列
    这篇文章将为大家详细讲解有关Redis中如何实现消息队列和延时消息队列,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。list的几个命令lpush (left push)由...
    99+
    2022-10-19
  • 如何利用rabbitMq的死信队列实现延时消息
    目录前言mq基本的消息模型mq死信队列的消息模型maven依赖配置普通队列和死信队列死信队列消费者发送消息测试测试成功总结前言 使用mq自带的死信去实现延时消息要注意一个坑点,就是m...
    99+
    2023-01-28
    rabbitMq死信队列 rabbitMq延时消息 rabbitMq延时队列
  • 基于rabbitmq延迟插件怎么实现分布式延迟任务
    本文小编为大家详细介绍“基于rabbitmq延迟插件怎么实现分布式延迟任务”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于rabbitmq延迟插件怎么实现分布式延迟任务”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-06-26
  • 怎么在Redis中实现延迟队列和分布式延迟队列
    这篇文章给大家介绍怎么在Redis中实现延迟队列和分布式延迟队列,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 实现一个简单的延迟队列。  我们知道目前JAVA可以有DelayedQueue,我们首先开一个Dela...
    99+
    2023-06-15
  • PHP实现异步延迟消息队列的方法详解
    目录一、前言二、场景三、安装RabbitMQ延迟队列插件四、在Laravel框架中进行使用五、执行生产消息和消费消息一、前言 需求:电商秒杀场景中,如果用户下单10分钟未支付,需要进...
    99+
    2022-11-13
  • RabbitMQ死信机制实现延迟队列的实战
    目录延迟队列应用场景TimeToLive(TTL) DeadLetterExchanges(DLX)延迟队列 延迟队列存储的对象肯定是对应的延时消息,所谓”延时消息”是指当...
    99+
    2022-11-12
  • SpringBoot怎么整合RabbitMQ处理死信队列和延迟队列
    今天小编给大家分享一下SpringBoot怎么整合RabbitMQ处理死信队列和延迟队列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2023-06-30
  • C#通过rabbitmq实现定时任务(延时队列)
    本文主要讲解如何通过RabbitMQ实现定时任务(延时队列) 环境准备 需要在MQ中进行安装插件 地址链接 插件介绍地址:https://www.rabbitmq.com/blog/...
    99+
    2022-11-12
  • Java实现Redis延时消息队列
    目录什么是延时任务 延时任务的特点 实现思路: 代码实现 1.消息模型2.RedisMq 消息队列实现类3.消息生产者 4.消息消费者 5. 消息执接口 6. 任务类型的实现类:可以...
    99+
    2022-11-12
  • RabbitMQ实现延迟队列的两种方式详解
    目录1. 用插件1.1 安装插件1.2 消息收发2. DLX 实现延迟队列2.1 延迟队列实现思路2.2 案例3. 小结定时任务各种各样,常见的定时任务例如日志备份,我们可能在每天凌...
    99+
    2022-11-12
  • 基于rabbitmq延迟插件实现分布式延迟任务
    目录一、延迟任务的使用场景二、组件安装三、RabbitMQ延迟队列插件的延迟队列实现1、基本原理2、核心组件开发走起之前给大家介绍过SpringBoot集成Redisson实现延迟队...
    99+
    2022-11-12
  • SpringBoot整合RabbitMQ实现延迟队列的示例详解
    目录如何保证消息不丢失什么是消息投递可靠性ttl死信队列什么是死信队列消息有哪几种情况成为死信延迟队列springboot整合rabbitmq实现订单超时自动关闭如何保证消息不丢失 ...
    99+
    2023-05-16
    SpringBoot RabbitMQ实现延迟队列 SpringBoot RabbitMQ延迟队列 SpringBoot RabbitMQ队列 SpringBoot RabbitMQ
  • Spring Boot与RabbitMQ结合实现延迟队列的示例
    背景何为延迟队列?顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。场景一:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单...
    99+
    2023-05-30
    spring boot rabbitmq
  • rabbitmq怎么删除队列中的消息
    要删除RabbitMQ队列中的消息,需要使用RabbitMQ的管理界面或者通过编程方式使用RabbitMQ的API。 使用Rab...
    99+
    2023-10-23
    rabbitmq
  • 使用Redis怎么实现延迟队列
    本篇文章给大家分享的是有关使用Redis怎么实现延迟队列,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。方案一:采用通过定时任务采用数据库/非关系型数据库轮询方案。优点: 实现简...
    99+
    2023-06-15
  • RabbitMQ实现延迟队列的两种方式分别是什么
    这期内容当中小编将会给大家带来有关RabbitMQ实现延迟队列的两种方式分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。定时任务各种各样,常见的定时任务例如日志备份,我们可能在每天凌晨 3 点去备...
    99+
    2023-06-22
  • 定时任务实现的关键DelayQueue延迟队列是什么
    定时任务实现的关键DelayQueue延迟队列是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。今天学习是并发包提供的延迟队列(DelayQueue)。延迟队列说明延迟队...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作