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

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

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

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

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

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

1.如何实现延迟队列?

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

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

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

2.实现延迟队列

2.1 安装并启动延迟队列

2.1.1 下载延迟插件

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

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

图片图片q6x28资讯网——每日最新资讯28at.com

2.1.2 将插件放到插件目录

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

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

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

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

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

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

图片q6x28资讯网——每日最新资讯28at.com

2.1.3 启动插件

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

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

图片q6x28资讯网——每日最新资讯28at.com

2.1.4 重启RabbitMQ服务

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

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

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

图片q6x28资讯网——每日最新资讯28at.com

2.1.5 验收结果

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

图片q6x28资讯网——每日最新资讯28at.com

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

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

图片q6x28资讯网——每日最新资讯28at.com

2.2 编写延迟消息实现代码

2.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.1.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;                });    }}

2.1.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;    }}

2.1.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);    }}

PS:获取本文延迟队列的实现 Demo,请加我:GG_Stone【备注:延迟队列】q6x28资讯网——每日最新资讯28at.com

小结

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

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

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

上一篇: 电视产业跃升:AI 芯片推动三星电视再度提至新高度

下一篇: 原理剖析| Kafka Exactly Once 语义实现原理:幂等性与事务消息

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾“低价”口号。而过去与他们错位竞争的拼多多,靠
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • iQOO Neo8系列新品发布会

    旗舰双芯 更强更Pro
Top