RabbitMQ通過(guò)延遲插件實(shí)現(xiàn)延遲消息
一、引言
上一章我們講到通過(guò)死信隊(duì)列組合消息過(guò)期時(shí)間來(lái)實(shí)現(xiàn)延遲消息,但相對(duì)而言這并不是比較好的方式。它的代碼實(shí)現(xiàn)相對(duì)來(lái)說(shuō)比較繁瑣,而且關(guān)鍵是RabbitMQ提供死信隊(duì)列的初衷并不是讓我們用來(lái)發(fā)送延遲消息的,而是為了作為兜底方案,來(lái)接收沒(méi)有消費(fèi)的死信的,以便于定位問(wèn)題。那么本章節(jié)我們就開(kāi)始講解通過(guò)延遲消息插件來(lái)實(shí)現(xiàn)延遲消息。
延遲消息插件可以將普通交換機(jī)改造為支持延遲消息功能的交換機(jī),當(dāng)消息投遞到交換機(jī)后可以暫存一定時(shí)間,到期后再投遞到隊(duì)列。
這個(gè)插件可以將普通交換機(jī)改造為支持延遲消息功能的交換機(jī),當(dāng)消息投遞到交換機(jī)后可以暫存一定時(shí)間,到期后再投遞到隊(duì)列。
發(fā)送消息時(shí)需要通過(guò)消息頭x-delay來(lái)設(shè)置過(guò)期時(shí)間:
二、延遲插件安裝
在Mac上安裝RabbitMQ延遲消息插件時(shí),確保你已經(jīng)安裝了RabbitMQ并且它正在運(yùn)行,操作步驟如下(Linux安裝步驟和方法類似,此處不做贅述):
2.1. 下載插件
從RabbitMQ官方GitHub倉(cāng)庫(kù)或者通過(guò)以下命令直接下載,我這里是最新版本:
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è)不斷攀登的過(guò)程【" + msg + "】"); } }
四、運(yùn)行效果
我們可以看到消息在延時(shí)10秒后消費(fèi)
五、總結(jié)
雖然延遲插件讓我們?cè)谙⒀舆t發(fā)送的代碼實(shí)現(xiàn)上已經(jīng)非常簡(jiǎn)潔,但是在使用延遲消息中還有一個(gè)問(wèn)題就是延遲消息比較損耗性能,我們?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接收日期的問(wèn)題解決
在做Java開(kāi)發(fā)時(shí),肯定會(huì)碰到傳遞時(shí)間參數(shù)的情況,本文主要介紹了springboot后端使用LocalDate接收日期的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09spring boot中多線程開(kāi)發(fā)的注意事項(xiàng)總結(jié)
spring boot 通過(guò)任務(wù)執(zhí)行器 taskexecutor 來(lái)實(shí)現(xiàn)多線程和并發(fā)編程。下面這篇文章主要給大家介紹了關(guān)于spring boot中多線程開(kāi)發(fā)的注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09淺析Spring boot 中 logback 配置<springPropert
這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02SpringBoot RestTemplate請(qǐng)求日志打印方式
這篇文章主要介紹了SpringBoot RestTemplate請(qǐng)求日志打印方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07解決Aop @AfterReturning因返回類型不一致導(dǎo)致無(wú)法執(zhí)行切面代碼
這篇文章主要介紹了解決Aop @AfterReturning因返回類型不一致導(dǎo)致無(wú)法執(zhí)行切面代碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07