广告
返回顶部
首页 > 资讯 > 后端开发 > Python >RabbitMQ消息队列实现延迟任务示例
  • 288
分享到

RabbitMQ消息队列实现延迟任务示例

2024-04-02 19:04:59 288人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、序言1、实现原理2、组件选型二、方案设计(一)服务器(二)生产者(三)消费者三、SpringBoot实现(一)生产者(二)消费者(三)通用工具包一、序言 延迟任务应用广泛,延

一、序言

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

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

1、实现原理

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

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

2、组件选型

二、方案设计

(一)服务器

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

(二)生产者

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

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

(三)消费者

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

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

三、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消息队列实现延迟任务示例的详细内容,更多关于RabbitMQ消息队列延迟任务的资料请关注编程网其它相关文章!

--结束END--

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

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

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

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

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

下载Word文档
猜你喜欢
  • RabbitMQ消息队列实现延迟任务示例
    目录一、序言1、实现原理2、组件选型二、方案设计(一)服务器(二)生产者(三)消费者三、SpringBoot实现(一)生产者(二)消费者(三)通用工具包一、序言 延迟任务应用广泛,延...
    99+
    2022-11-13
  • RabbitMQ消息队列怎么实现延迟任务
    这篇文章主要介绍“RabbitMQ消息队列怎么实现延迟任务”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“RabbitMQ消息队列怎么实现延迟任务”文章能帮助大家解决问题。一、序言延迟任务应用广泛,延...
    99+
    2023-06-29
  • 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
  • PHP实现RabbitMQ消息列队的示例代码
    目录业务场景1、首先部署好thinkphp6框架2、安装workerman扩展3、生产者4、消费者5、整体测试业务场景 项目公司是主php做开发的,框架为thinkphp。众所周知,...
    99+
    2022-11-13
  • Go+Kafka实现延迟消息的实现示例
    目录前言原理简单的实现生产者延迟服务消费者改进点通用的延迟服务生产者负责延迟服务总结前言 延迟队列是一个非常有用的工具,我们经常遇到需要使用延迟队列的场景,比如延迟通知,订单关闭等等...
    99+
    2022-11-13
  • Redis中如何实现消息队列和延时消息队列
    这篇文章将为大家详细讲解有关Redis中如何实现消息队列和延时消息队列,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。list的几个命令lpush (left push)由...
    99+
    2022-10-19
  • 如何利用rabbitMq的死信队列实现延时消息
    目录前言mq基本的消息模型mq死信队列的消息模型maven依赖配置普通队列和死信队列死信队列消费者发送消息测试测试成功总结前言 使用mq自带的死信去实现延时消息要注意一个坑点,就是m...
    99+
    2023-01-28
    rabbitMq死信队列 rabbitMq延时消息 rabbitMq延时队列
  • PHP实现异步延迟消息队列的方法详解
    目录一、前言二、场景三、安装RabbitMQ延迟队列插件四、在Laravel框架中进行使用五、执行生产消息和消费消息一、前言 需求:电商秒杀场景中,如果用户下单10分钟未支付,需要进...
    99+
    2022-11-13
  • PHP怎么实现RabbitMQ消息列队
    这篇“PHP怎么实现RabbitMQ消息列队”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP怎么实现RabbitMQ消息...
    99+
    2023-06-30
  • RabbitMQ死信机制实现延迟队列的实战
    目录延迟队列应用场景TimeToLive(TTL) DeadLetterExchanges(DLX)延迟队列 延迟队列存储的对象肯定是对应的延时消息,所谓”延时消息”是指当...
    99+
    2022-11-12
  • 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
  • 消息队列RabbitMQ入门与PHP实例分析
    本篇内容主要讲解“消息队列RabbitMQ入门与PHP实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“消息队列RabbitMQ入门与PHP实例分析”吧!消息队列介绍以及消息队列应用场景Ra...
    99+
    2023-06-30
  • 基于rabbitmq延迟插件怎么实现分布式延迟任务
    本文小编为大家详细介绍“基于rabbitmq延迟插件怎么实现分布式延迟任务”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于rabbitmq延迟插件怎么实现分布式延迟任务”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-06-26
  • springcloud中RabbitMQ死信队列与延迟交换机实现方法
    目录0.引言1. 死信队列1.2 什么是死信?1.3 什么是死信队列?1.4 创建死信交换机、死信队列1.5 实现死信消息1.5.1 基于消费者进行reject或nack实现死信消息...
    99+
    2022-11-13
  • RabbitMQ实现延迟队列的两种方式分别是什么
    这期内容当中小编将会给大家带来有关RabbitMQ实现延迟队列的两种方式分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。定时任务各种各样,常见的定时任务例如日志备份,我们可能在每天凌晨 3 点去备...
    99+
    2023-06-22
  • redis用list做消息队列的实现示例
    目录生产消息服务消费消息服务,定时任务日志测试leftPush消息入队,rightPop对应,消息出队。 rightPop(RedisConstant.MQ_LIST, 0L, Ti...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作