RabbitMQ通過延遲插件實(shí)現(xiàn)延遲消息
一、引言
上一章我們講到通過死信隊(duì)列組合消息過期時(shí)間來實(shí)現(xiàn)延遲消息,但相對(duì)而言這并不是比較好的方式。它的代碼實(shí)現(xiàn)相對(duì)來說比較繁瑣,而且關(guān)鍵是RabbitMQ提供死信隊(duì)列的初衷并不是讓我們用來發(fā)送延遲消息的,而是為了作為兜底方案,來接收沒有消費(fèi)的死信的,以便于定位問題。那么本章節(jié)我們就開始講解通過延遲消息插件來實(shí)現(xiàn)延遲消息。
延遲消息插件可以將普通交換機(jī)改造為支持延遲消息功能的交換機(jī),當(dāng)消息投遞到交換機(jī)后可以暫存一定時(shí)間,到期后再投遞到隊(duì)列。

這個(gè)插件可以將普通交換機(jī)改造為支持延遲消息功能的交換機(jī),當(dāng)消息投遞到交換機(jī)后可以暫存一定時(shí)間,到期后再投遞到隊(duì)列。

發(fā)送消息時(shí)需要通過消息頭x-delay來設(shè)置過期時(shí)間:

二、延遲插件安裝
在Mac上安裝RabbitMQ延遲消息插件時(shí),確保你已經(jīng)安裝了RabbitMQ并且它正在運(yùn)行,操作步驟如下(Linux安裝步驟和方法類似,此處不做贅述):
2.1. 下載插件
從RabbitMQ官方GitHub倉(cāng)庫(kù)或者通過以下命令直接下載,我這里是最新版本:
wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v4.0.2/rabbitmq_delayed_message_exchange-4.0.2.ez
2.2. 安裝插件

將下載的插件拷貝到RabbitMQ的plugins目錄,使用RabbitMQ插件管理命令安裝下載的插件:

sudo rabbitmq-plugins enable rabbitmq_delayed_message_exchange

如果你的RabbitMQ是以Docker容器的方式運(yùn)行的,你可以將插件下載步驟和安裝步驟合并為一個(gè)Docker命令,例如:
docker run -d --name rabbitmq -e RABBITMQ_PLUGINS='rabbitmq_delayed_message_exchange' rabbitmq:3-management
這個(gè)命令會(huì)啟動(dòng)一個(gè)帶有RabbitMQ管理插件的容器,并且會(huì)自動(dòng)安裝延遲消息插件。
2.3. 確認(rèn)插件是否生效
安裝成功后,RabbitMQ的瀏覽器界面上,exchange交換機(jī)在創(chuàng)建時(shí),Type多了x-delayed-message選項(xiàng)。

請(qǐng)注意,具體的RabbitMQ版本和插件版本可能會(huì)更新,因此請(qǐng)根據(jù)實(shí)際情況下載相應(yīng)的版本。
三、核心代碼
package com.example.publisher;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;
import java.nio.charset.StandardCharsets;
/**
* 生產(chǎn)者
*/
@Slf4j
@SpringBootTest
class PublisherApplicationTests {
@Resource
private RabbitTemplate rabbitTemplate;
@Test
void test() {
String content = "生活不易,所以保持足夠的努力,對(duì)自己要有信心,積極地去面對(duì)工作生活的挑戰(zhàn)!";
Message message = MessageBuilder.withBody(content.getBytes(StandardCharsets.UTF_8)).build();
message.getMessageProperties().setDelayLong(10000L);
rabbitTemplate.convertAndSend("delay.direct",
"delay", message);
}
}package com.example.consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
/**
* 消費(fèi)者
*/
@Slf4j
@Component
public class SimpleListener {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "delay.queue", durable = "true"),
exchange = @Exchange(name = "delay.direct", delayed = "true"),
key = "delay"
))
public void listener1(Message message) throws Exception {
String msg = new String(message.getBody(), StandardCharsets.UTF_8); ;
System.out.println("延遲消息:人生是個(gè)不斷攀登的過程【" + msg + "】");
}
}四、運(yùn)行效果
我們可以看到消息在延時(shí)10秒后消費(fèi)


五、總結(jié)
雖然延遲插件讓我們?cè)谙⒀舆t發(fā)送的代碼實(shí)現(xiàn)上已經(jīng)非常簡(jiǎn)潔,但是在使用延遲消息中還有一個(gè)問題就是延遲消息比較損耗性能,我們?cè)赗abbitMQ上使用延遲消息時(shí),它的內(nèi)部就會(huì)維護(hù)一個(gè)時(shí)鐘,每當(dāng)我們定義一個(gè)新的延遲消息它就會(huì)創(chuàng)建一個(gè)新的時(shí)鐘。如果一個(gè)任務(wù)的延遲時(shí)間特別長(zhǎng),比如一小時(shí)甚至一天,將非常耗性能。所以延遲消息比較適用于延遲的時(shí)間比較短的場(chǎng)景,比如10分鐘未支付取消訂單。
但是我們?nèi)绻苯釉O(shè)定10分鐘后發(fā)送延遲消息,也不是最優(yōu)解,我們將在下一章,對(duì)延遲消息做近一步的優(yōu)化!
到此這篇關(guān)于RabbitMQ延遲消息之延遲插件的文章就介紹到這了,更多相關(guān)RabbitMQ延遲插件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot后端使用LocalDate接收日期的問題解決
在做Java開發(fā)時(shí),肯定會(huì)碰到傳遞時(shí)間參數(shù)的情況,本文主要介紹了springboot后端使用LocalDate接收日期的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
spring boot中多線程開發(fā)的注意事項(xiàng)總結(jié)
spring boot 通過任務(wù)執(zhí)行器 taskexecutor 來實(shí)現(xiàn)多線程和并發(fā)編程。下面這篇文章主要給大家介紹了關(guān)于spring boot中多線程開發(fā)的注意事項(xiàng),文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09
淺析Spring boot 中 logback 配置<springPropert
這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02
SpringBoot RestTemplate請(qǐng)求日志打印方式
這篇文章主要介紹了SpringBoot RestTemplate請(qǐng)求日志打印方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
解決Aop @AfterReturning因返回類型不一致導(dǎo)致無法執(zhí)行切面代碼
這篇文章主要介紹了解決Aop @AfterReturning因返回類型不一致導(dǎo)致無法執(zhí)行切面代碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

