?
目錄
一、使用場景
?二、第一種方式:創(chuàng)建具有超時功能且綁定死信交換機(jī)的消息隊列
三、第二種方式:創(chuàng)建通用延時消息
四、第三種方式:使用rabbitmq的延時隊列插件,實現(xiàn)同一個隊列中有多個不同超時時間的消息,并按時間超時順序出隊
4.1?下載延遲插件
4.2?安裝插件并啟用
五、延遲隊列圖示
六、源代碼參考
一、使用場景
- 1.定時發(fā)布文章
- 2.秒殺之后,給30分鐘時間進(jìn)行支付,如果30分鐘后,沒有支付,訂單取消。
- 3.預(yù)約餐廳,提前半個小時發(fā)短信通知用戶。
A -> 13:00 17:00 16:30 延遲時間: 7*30 * 60 * 1000
B -> 11:00 18:00 17:30 延遲時間: 13*30 * 60 * 1000
C -> 8:00 14:00 13:30 延遲時間: 11*30 * 60 * 1000
?二、第一種方式:創(chuàng)建具有超時功能且綁定死信交換機(jī)的消息隊列
@Bean
public Queue directQueueLong(){
return QueueBuilder.durable("業(yè)務(wù)隊列名稱")
.deadLetterExchange("死信交換機(jī)名稱")
.deadLetterRoutingKey("死信隊列 RoutingKey")
.ttl(20000) // 消息停留時間
//.maxLength(500)
.build();
}
監(jiān)聽死信隊列,即可處理超時的消息隊列
缺點:
上述實現(xiàn)方式中,ttl延時隊列中所有的消息超時時間都是一樣的,如果不同消息想設(shè)置不一樣的超時時間,就需要建立多個不同超時時間的消息隊列,比較麻煩,且不利于維護(hù)。
三、第二種方式:創(chuàng)建通用延時消息
rabbitTemplate.convertAndSend("交換機(jī)名稱", "RoutingKey","對象",
message => {
message.getMessageProperties().setExpiration(String.valueOf(5000))
return message;
}
);
缺點:
該種方式可以創(chuàng)建一個承載不同超時時間消息的消息隊列,但是這種方式有一個問題,如果消息隊列中排在前面的消息沒有到超時時間,即使后面的消息到了超時時間,先到超時時間的消息也不會進(jìn)入死信隊列,而是先檢查排在最前面的消息隊列是否到了超時時間,如果到了超時時間才會繼續(xù)檢查后面的消息。
四、第三種方式:使用rabbitmq的延時隊列插件,實現(xiàn)同一個隊列中有多個不同超時時間的消息,并按時間超時順序出隊
4.1?下載延遲插件
在 RabbitMQ 的 3.5.7 版本之后,提供了一個插件(rabbitmq-delayed-message-exchange)來實現(xiàn)延遲隊列 ,同時需保證 Erlang/OPT 版本為 18.0 之后。
我這里 MQ 的版本是 3.10.0 現(xiàn)在去 GitHub 上根據(jù)版本號下載插件
?https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
4.2?安裝插件并啟用
我用的是 Docker 客戶端,下載完成后直接把插件放在 /root 目錄,然后拷貝到容器內(nèi)plugins目錄下(rabbitmq是容器的name,也可以使用容器id)?
docker cp /opt/rabbitmq_delayed_message_exchange-3.10.0.ez rabbitmq:/plugins
?進(jìn)入 Docker 容器
docker exec -it rabbitmq /bin/bash
在plugins內(nèi)啟用插件
#先執(zhí)行,解除防火墻限制,增加文件權(quán)限
umask 0022
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
退出容器
exit
重啟 RabbitMQ
docker restart rabbitmq
通過UI查看
五、延遲隊列圖示
當(dāng)C端用戶發(fā)出消息的時候,延遲隊列會實時檢測誰的時間最短,自動將最短的排在前面,一定程度上避免了阻塞
文章來源:http://www.zghlxwxcb.cn/news/detail-850768.html
六、源代碼參考
https://codeup.aliyun.com/62858d45487c500c27f5aab5/springboot-rabbitmq.git?文章來源地址http://www.zghlxwxcb.cn/news/detail-850768.html
到了這里,關(guān)于RabbitMQ-延遲隊列的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!