title: 【MQ】使用擴(kuò)展
date: 2017-12-08 22:00:03
tags: MQ
categories: MQ
TTL
帶有 TTL 的消息
消息指定 TTL 有兩種方式:
- 通過隊(duì)列屬性設(shè)置,到達(dá)該隊(duì)列的所有消息都具有相同的 TTL(x-message-ttl)
- 對(duì)消息進(jìn)行單獨(dú)設(shè)置,每條消息的 TTL 可以不同(setExpiration)
兩者差異:方式一設(shè)置的消息一旦過期就會(huì)從隊(duì)列中丟棄,方式二設(shè)置的消息過期后需要在被消費(fèi)時(shí)才丟棄
如果同時(shí)使用以上兩種消息則以較小的為準(zhǔn)。
帶有 TTL 的隊(duì)列
隊(duì)列聲明時(shí)可以(通過 x-expires)指定多久未使用后隊(duì)列將被刪除,使用場(chǎng)景:RPC 模式下用于回復(fù)而創(chuàng)建的 queue。
死信
死信:隊(duì)列無法處理的消息,文檔中定義了以下三種場(chǎng)景:
- 消費(fèi)端發(fā)送 basic.reject or basic.nack 指令(并且需要設(shè)置 requeue=false )
- TTL 過期的消息
- 隊(duì)列達(dá)到最大長(zhǎng)度
在消息投遞前如果指定消息成為死信后的處理交換器和 routking,當(dāng)消息成為死信后 Rabbit MQ 可以根據(jù)先前的配置重新投遞。
延時(shí)消息
使用 TTL 消息和死信重新投遞就可以容易的構(gòu)造出延時(shí)消息的功能了。
創(chuàng)建兩個(gè)交換器,兩個(gè) binding, 兩個(gè)隊(duì)列,延時(shí)的過程:
- exchange1 接收生產(chǎn)者的消息,根據(jù) binding 轉(zhuǎn)發(fā)給 queue1
- queue1 的消息設(shè)置統(tǒng)一的 TTL,并且不對(duì) queue1 數(shù)據(jù)進(jìn)行任何消費(fèi)動(dòng)作
- 等 queue1 的消息過期后 MQ 重新將消息投遞到 exchange2
- exchange2 根據(jù) bindling 信息轉(zhuǎn)發(fā)給 queue2
- 消費(fèi)者從 queue2 消費(fèi)消息
優(yōu)先級(jí)隊(duì)列
消息在發(fā)送時(shí)如果指定優(yōu)先級(jí),則當(dāng)隊(duì)列中消息堆積時(shí),高優(yōu)先級(jí)的消息可以被優(yōu)先消費(fèi)掉。具體的做法:
- 創(chuàng)建隊(duì)列時(shí),指定隊(duì)列的最大優(yōu)先級(jí)
- 投遞消息時(shí)指定消息的優(yōu)先級(jí)
消息到達(dá)隊(duì)列后,Rabbit MQ 會(huì)根據(jù)優(yōu)先級(jí)進(jìn)行處理,完全自動(dòng)。