1. rabbitMQ的推模式和拉模式
我們知道,消費(fèi)者有兩種方式從消息中間件獲取消息:
推模式:消息中間件主動(dòng)將消息推送
給消費(fèi)者
拉模式:消費(fèi)者主動(dòng)從消息中間件拉取
消息
推模式:將消息提前推送給消費(fèi)者领追,消費(fèi)者必須設(shè)置一個(gè)緩沖區(qū)緩存這些消息子库。好處很明顯,消費(fèi)者總是有一堆在內(nèi)存中待處理的消息,所以效率高瓜晤。缺點(diǎn):是緩沖區(qū)可能會(huì)溢出。
實(shí)現(xiàn)推模式推薦的方式是繼承DefaultConsumer
基類腹纳,也可以使用Spring AMQP
的SimpleMessageListenerContainer
痢掠。
拉模式:在消費(fèi)者需要時(shí)才去消息中間件拉取消息驱犹,這段網(wǎng)絡(luò)開(kāi)銷會(huì)明顯增加消息延遲,降低系統(tǒng)吞吐量足画。
實(shí)現(xiàn)拉模式RabbitMQ
的Channel
提供了basicGet
方法用于拉取消息雄驹。
push
更關(guān)注實(shí)時(shí)性,pull
更關(guān)注消費(fèi)者消費(fèi)能力
推模式是做最常用的淹辞,但是某些情況下推模式并不適用:
- 由于某些限制医舆,消費(fèi)者在某個(gè)條件成立時(shí)才能消費(fèi)消息。
- 需要批量拉取消息進(jìn)行處理象缀。
1.1 實(shí)現(xiàn)拉(pull)模式
With AMQP 0-9-1 it is possible to fetch messages one by one using the basic.get protocol method. Messages are fetched in the FIFO order. It is possible to use automatic or manual acknowledgements, just like with consumers (subscriptions).
Fetching messages one by one is not necessary in most cases as it is inefficient and has all the downsides of polling. When in doubt, prefer registering a consumer.
官方對(duì)pull的定義是:可以使用basic.get
協(xié)議方法逐個(gè)獲取消息蔬将。消息以FIFO
(先進(jìn)先出)順序獲取,可以使用手動(dòng)確定攻冷,就像消費(fèi)者(訂閱)一樣娃胆。
大多數(shù)情況下,不需要逐個(gè)獲取消息等曼。因?yàn)樗男实屠锓常⑶揖哂休喸兊乃腥秉c(diǎn)。
使用basicGet
拉模式需要注意:
- Queue中沒(méi)有消息是basicGet返回null禁谦,此時(shí)應(yīng)用應(yīng)當(dāng)適當(dāng)休眠胁黑。
- 如果需要實(shí)現(xiàn)消息的可靠消費(fèi),應(yīng)當(dāng)傳遞autoAck為false州泊。
-
GetResponse
的envelope
屬性的deliveryTag
屬性用于ACK消息傳遞給basicAck
丧蘸。 - 使用拉模式需要自己實(shí)現(xiàn)線程池。
1.2 批量拉纫T怼(pull)消息
RabbitMQ支持客戶端批量拉取消息力喷,可以連續(xù)調(diào)用basicGet
方法拉取多條消息,處理完畢一次性返回ACK演训。
需要注意:
- 批量拉取循環(huán)的退出條件:達(dá)到數(shù)量上限弟孟,basicGet返回null。
- 使用basic批量ACK傳遞的參數(shù)是最后一條消息的deliveryTag样悟。