2 回答

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
這真的取決于你想做什么。如果您只想從隊(duì)列中獲取一條消息(第一個(gè)),您可能應(yīng)該使用basic.get
,如果您打算處理來自隊(duì)列的所有傳入消息 -basic.consume
這就是您想要的。
可能不是平臺或庫特定的問題,而是協(xié)議理解問題。
UPD
我不太熟悉它的 go 語言,所以我會盡量給你一些關(guān)于 AMQP 細(xì)節(jié)的簡要介紹并描述用例。
您basic.consume
有時(shí)可能會遇到麻煩并產(chǎn)生開銷:
有了basic.consume
這樣的工作流程:
Send
basic.consume
方法通知broker你想接收消息雖然這是一個(gè)同步方法,但等待
basic.consume-ok
來自代理的消息開始監(jiān)聽
basic.deliver
來自服務(wù)器的消息這是一種異步方法,您應(yīng)該自己注意服務(wù)器上沒有可用消息的情況,例如限制閱讀時(shí)間
有了basic.get
這樣的工作流程:
向
basic.get
代理 發(fā)送同步方法等待
basic.get-ok
方法,保存消息或basic.empty
方法,表示服務(wù)器上沒有可用消息的情況
關(guān)于同步和異步方法的注意事項(xiàng):同步的預(yù)期會有一些響應(yīng),異步是否沒有
關(guān)于basic.qos
方法prefetch-count
屬性的注意事項(xiàng):當(dāng)no-ack
屬性設(shè)置為basic.consume
或時(shí),它會被忽略basic.get
。
Spec 有一個(gè)注釋basic.get
:“此方法使用同步對話提供對隊(duì)列中消息的直接訪問,該同步對話是為特定類型的應(yīng)用程序設(shè)計(jì)的,其中同步功能比性能更重要”,適用于連續(xù)消息消費(fèi)。
我的個(gè)人測試表明,在 RabbitMQ 3.0.1、Erlang R14B04 上,使用basic.get
(0.38659715652466) 獲取 1000 條消息比逐行獲取 1000 條消息 (0.47398710250854) 快basic.consume
15% 以上。
如果您只在主線程中使用一條消息 - 可能您必須使用basic.get
.
您仍然可以僅異步使用一條消息,例如在單獨(dú)的線程中或使用某些事件機(jī)制。有時(shí)這對您的機(jī)器資源來說是更好的解決方案,但您必須注意隊(duì)列中沒有可用消息的情況。
如果你必須一一處理消息很明顯basic.consume
應(yīng)該使用,我認(rèn)為
- 2 回答
- 0 關(guān)注
- 262 瀏覽
添加回答
舉報(bào)