Rabbitmq延遲發(fā)送消息解決方案
一、 什么是延遲隊(duì)列:
延遲隊(duì)列存儲(chǔ)的對象肯定是對應(yīng)的延時(shí)消息,所謂”延時(shí)消息”是指當(dāng)消息被發(fā)送以后,并不想讓消費(fèi)者立即拿到消息,而是等待指定時(shí)間后,消費(fèi)者才拿到這個(gè)消息進(jìn)行消費(fèi)。
二、 怎樣實(shí)現(xiàn)延遲消息:
方案1:通過延遲消息或延遲隊(duì)列或兩者都延遲(取時(shí)間較短的)的方式實(shí)現(xiàn)。
1):通過隊(duì)列延遲來實(shí)現(xiàn)(我在可視化工具來實(shí)現(xiàn)):
流程1:
流程2:
1、創(chuàng)建交換器:(一個(gè)是延遲消息的交換器(auditExchange),一個(gè)是延遲消息重新找到的交換器(delExchage))
注意:這里的delExchange是延遲隊(duì)列重新找到的交換器。這里Internal設(shè)置為NO,否則將無法接受dead letter,YES表示這個(gè)exchange不可以被client用來推送消息,僅用來進(jìn)行exchange和exchange之間的綁定。
2、創(chuàng)建延遲的隊(duì)列:
注意:
x-message-ttl=30000 設(shè)置延遲時(shí)間為30000ms.
x-max-length:最大積壓的消息個(gè)數(shù),可以根據(jù)自己的實(shí)際情況設(shè)置,超過限制消息不會(huì)丟失,會(huì)立即轉(zhuǎn)向delayToExchange進(jìn)行投遞.
x-dead-letter-exchange:設(shè)置為剛剛配置好的delayToExchange,消息過期后會(huì)通過delayToExchange進(jìn)行投遞
x-dead-letter-routing-key:是延遲隊(duì)列重新找到的key
3、延遲隊(duì)列綁定:
注意:from exchange:設(shè)定的是延遲隊(duì)列的交換器.
routing key:設(shè)定的是綁定時(shí)的key.
4、延時(shí)隊(duì)列重新找到的交換器與queue綁定:
注意:from exchange:是延遲隊(duì)列重新找到的交換器。
routing key:是延遲隊(duì)列重新找到的key。
方案2:通過插件來實(shí)現(xiàn)。在rabbitmq 3.5.7及以上的版本提供了一個(gè)插件(rabbitmq-delayed-message-exchange)來實(shí)現(xiàn)延遲隊(duì)列功能。同時(shí)插件依賴Erlang/OPT 18.0及以上。