当前位置:首页 > 科技  > 软件

面试官:RabbitMQ如何实现延迟队列?

来源: 责编: 时间:2024-01-26 17:05:32 302观看
导读延迟队列是指当消息被发送以后,并不是立即执行,而是等待特定的时间后,消费者才会执行该消息。延迟队列的使用场景有以下几种:未按时支付的订单,30 分钟过期之后取消订单。给活跃度比较低的用户间隔 N 天之后推送消息,提高活

q6G28资讯网——每日最新资讯28at.com

延迟队列是指当消息被发送以后,并不是立即执行,而是等待特定的时间后,消费者才会执行该消息。q6G28资讯网——每日最新资讯28at.com

延迟队列的使用场景有以下几种:q6G28资讯网——每日最新资讯28at.com

  1. 未按时支付的订单,30 分钟过期之后取消订单。
  2. 给活跃度比较低的用户间隔 N 天之后推送消息,提高活跃度。
  3. 新注册会员的用户,等待几分钟之后发送欢迎邮件等。

一、如何实现延迟队列?

延迟队列有以下两种实现方式:q6G28资讯网——每日最新资讯28at.com

  1. 通过消息过期后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能;
  2. 使用官方提供的延迟插件实现延迟功能。

早期,大部分公司都会采用第一种方式,而随着 RabbitMQ 3.5.7(2015 年底发布)的延迟插件的发布,因为其使用更简单、更方便,所以它现在才是大家普通会采用的,实现延迟队列的方式,所以本文也只讲第二种方式。q6G28资讯网——每日最新资讯28at.com

二、实现延迟队列

1、安装并启动延迟队列

(1)下载延迟插件

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases.q6G28资讯网——每日最新资讯28at.com

注意:需要根据你自己的 RabbitMQ 服务器端版本选择相同版本的延迟插件,可以在 RabbitMQ 控制台查看:q6G28资讯网——每日最新资讯28at.com

q6G28资讯网——每日最新资讯28at.com

q6G28资讯网——每日最新资讯28at.com

(2)将插件放到插件目录

接下来,将上一步下载的插件放到 RabbitMQ 服务器安装目录,如果是 docker,使用一下命令复制:q6G28资讯网——每日最新资讯28at.com

docker cp 宿主机文件 容器名称或ID:容器目录q6G28资讯网——每日最新资讯28at.com

如下图所示:q6G28资讯网——每日最新资讯28at.com

q6G28资讯网——每日最新资讯28at.com

之后,进入 docker 容器,查看插件中是否包含延迟队列:q6G28资讯网——每日最新资讯28at.com

docker exec -it 容器名称或ID /bin/bash rabbitmq-plugins listq6G28资讯网——每日最新资讯28at.com

如下图所示:q6G28资讯网——每日最新资讯28at.com

q6G28资讯网——每日最新资讯28at.com

(3)启动插件

rabbitmq-plugins enable rabbitmq_delayed_message_exchangeq6G28资讯网——每日最新资讯28at.com

如下图所示:q6G28资讯网——每日最新资讯28at.com

q6G28资讯网——每日最新资讯28at.com

(4)重启RabbitMQ服务

安装完 RabbitMQ 插件之后,需要重启 RabbitMQ 服务才能生效。如果使用的是 Docker,只需要重启 Docker 容器即可:q6G28资讯网——每日最新资讯28at.com

docker restart 容器名称或IDq6G28资讯网——每日最新资讯28at.com

如下图所示:q6G28资讯网——每日最新资讯28at.com

q6G28资讯网——每日最新资讯28at.com

(5)验收结果

在 RabbitMQ 控制台查看,新建交换机时是否有延迟消息选项,如果有就说明延迟消息插件已经正常运行了,如下图所示:q6G28资讯网——每日最新资讯28at.com

q6G28资讯网——每日最新资讯28at.com

(6)手动创建延迟交换器(可选)

此步骤可选(非必须),因为某些版本下通过程序创建延迟交换器可能会出错,如果出错了,手动创建延迟队列即可,如下图所示:q6G28资讯网——每日最新资讯28at.com

q6G28资讯网——每日最新资讯28at.com

2、编写延迟消息实现代码

(1)配置交换器和队列

import org.springframework.context.annotation.Configuration;import org.springframework.amqp.core.*;import org.springframework.context.annotation.Bean;/** * 延迟交换器和队列 */@Configurationpublic class DelayedExchangeConfig {    public static final String EXCHANGE_NAME = "myDelayedExchange";    public static final String QUEUE_NAME = "delayed.queue";    public static final String ROUTING_KEY = "delayed.routing.key";    @Bean    public CustomExchange delayedExchange() {        return new CustomExchange(EXCHANGE_NAME,                "x-delayed-message", // 消息类型                true, // 是否持久化                false); // 是否自动删除    }    @Bean    public Queue delayedQueue() {        return QueueBuilder.durable(QUEUE_NAME)                .withArgument("x-delayed-type", "direct")                .build();    }    @Bean    public Binding delayedBinding(Queue delayedQueue,CustomExchange delayedExchange) {        return BindingBuilder.bind(delayedQueue()).to(delayedExchange()).with(ROUTING_KEY).noargs();    }}

(2)定义消息发送方法

import org.springframework.amqp.rabbit.core.RabbitTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;@Componentpublic class DelayedMessageProducer {    @Autowired    private RabbitTemplate rabbitTemplate;    @Scheduled(fixedDelay = 5000)    public void sendDelayedMessage(String message) {        rabbitTemplate.convertAndSend(DelayedExchangeConfig.EXCHANGE_NAME,                DelayedExchangeConfig.ROUTING_KEY,                message,                messagePostProcessor -> {                    messagePostProcessor.getMessageProperties().setDelay(10000); // 设置延迟时间,单位毫秒                    return messagePostProcessor;                });    }}

(3)发送延迟消息

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/delayed")public class DelayedMessageController {    @Autowired    private DelayedMessageProducer delayedMessageProducer;    @GetMapping("/send")    public String sendDirectMessage(@RequestParam String message) {        delayedMessageProducer.sendDelayedMessage(message);        return "Delayed message sent to Exchange: " + message;    }}

(4)接收延迟消息

import org.springframework.amqp.rabbit.annotation.RabbitListener;import org.springframework.stereotype.Component;@Componentpublic class DelayedMessageConsumer {    @RabbitListener(queues = DelayedExchangeConfig.QUEUE_NAME)    public void receiveDelayedMessage(String message) {        System.out.println("Received delayed message: " + message);    }}

小结

实现 RabbitMQ 延迟队列目前主流的实现方式,是采用官方提供的延迟插件来实现。而延迟插件需要先下载插件、然后配置并重启 RabbitMQ 服务,之后就可以通过编写代码的方式实现延迟队列了。q6G28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-69002-0.html面试官:RabbitMQ如何实现延迟队列?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 灵活运用动态内存管理[new、delete]

下一篇: 如何优雅的发布一个 TypeScript 软件包?

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 自研Exynos回归!三星Galaxy S24系列将提供Exynos和骁龙双版本

    年初,全新的三星Galaxy S23系列发布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三个版本,全系搭载超频版骁龙8 Gen 2,虽同样采用台积电4nm工艺制
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top