2014-02-10 72 views
0

我有8個消費者在一個隊列中,他們中的任何一個都可以接收消息,並且一旦處理完畢,就會影響數據庫。大多數消息可以異步運行,但是在一些消息上,我們需要停止消耗隊列,直到消息被其中一個消費者完全處理。在此期間,其他7位消費者不應該在隊列中消耗。使用Rabbitmq實現阻塞消息(或在發佈者和消費者之間進行確認)

有沒有辦法在rabbitmq中實現這一點,而不是做一個應用程序級解決方案(這可能很難實現)?

+0

當您收到同步消息時,是否需要停止處理所有消息,或者只是連續處理所有同步消息? – lreeder

+0

@lreeder當一個同步(阻塞)消息進入時,我們需要停止獲取它後面的所有消息(因爲必須假設阻塞消息對db/cache進行了更改來處理它們),這很容易消費者,而不是8個消費者,沒有rabbitmq的幫助,我們無法控制其他7個消費者 –

回答

0

我不知道嚴格的RabbitMQ更改,使其工作。但是,這裏的方法不需要修改任何舊代碼,除了重命名生產者正在放置消息的隊列。它確實需要編寫一個新的消費者:

  1. 創建一個消耗單個隊列,並更新您的生產者發送消息到該隊列。
  2. 該隊列的使用者應處理任何同步消息。
  3. 由於它是單個使用者,所有其他消息都會在隊列中阻塞,直到完成處理。
  4. 單個消費者應該將任何異步消息轉發給其他八個消費者處理的原始隊列。

由於單個消費者只是轉發異步消息,所以它可以快速完成並且不應該存在吞吐量問題。

相關問題