2011-04-19 41 views
0

有誰知道是否在RabbitMQ隊列上的彈出操作是原子?RabbitMQ彈出操作原子性

我有幾個進程從同一個隊列讀取(隊列被標記爲持久的,運行在2.0.0版本上),我看到一些很奇怪的行爲。

+1

你是什麼意思的「原子」?另外,你的ack策略是什麼?你是否在每條信息到達後立即回覆,然後對其進行處理,或者你是否在處理信息,然後確認? – 2011-04-20 19:10:33

+0

我正在使用自動確認。原子的意思是,如果一個進程彈出一條消息,其他任何進程都可能彈出相同的消息。即通過單獨的過程對該消息進行兩次處理。 – Ceilingfish 2011-05-03 08:38:47

回答

2

如果您的多個進程正在使用來自同一隊列的消息,則他們不應該使用相同的消息。

這裏有警告,雖然:

  1. 如果消息已經被經紀人送到你的消費者之一,它拒絕的消息(或得到一個機會,承認之前終止),那麼經紀人將把它放回到同一隊列中,並將其交付給其餘的活動消費者之一。

  2. 如果您的消費者正在從不同的隊列中取出 - 每個隊列都有匹配的綁定 - 則代理會將消息的副本放在每個隊列上,並且每個消費者將獲得相同消息的副本。

+0

現貨。感謝Brian – Ceilingfish 2011-05-04 11:04:59

+0

編寫一個小應用程序將會消耗隊列中的消息並打印出消息對象中可用的所有信息,這非常有用。然後製作另一個獲取消息並打印相同消息的應用程序。你會注意到獲取和使用提供了不同的信息,並且你可以檢測到消息何時被另一個監聽器重新發送。 – 2011-05-31 04:49:47