首頁 >後端開發 >php教程 >Rabbitmq怎麼知道消費者執行是否成功.

Rabbitmq怎麼知道消費者執行是否成功.

WBOY
WBOY原創
2016-09-12 17:44:442006瀏覽

場景:下訂單,扣庫存。
我的想法是把下訂單的任務放到隊列裡面 一個個進行處理,這樣庫存在扣減的時候,就不會出錯了。
就是生產者與消費者
用戶在UI中點擊「提交訂單」時,把任務放到隊列,等待隊列處理這個任務的結果,根據結果(成功或失敗)進行頁面跳轉

但是有一個問題:隊列處理後,如何把結果通知生產者?
以RabbitMQ為例子,有哪位大神可以給出代碼.

回覆內容:

場景:下訂單,扣庫存。
我的想法是把下訂單的任務放到隊列裡面 一個個進行處理,這樣庫存在扣減的時候,就不會出錯了。
就是生產者與消費者
用戶在UI中點擊「提交訂單」時,把任務放到隊列,等待隊列處理這個任務的結果,根據結果(成功或失敗)進行頁面跳轉

但是有一個問題:隊列處理後,如何把結果通知生產者?
以RabbitMQ為例子,有哪位大神可以給出代碼.

quene只能保證訊息到達與否,具體你業務是否執行成功。這個訊息隊列可不保證。

生產者發布訊息之後監聽另外一個回傳訊息佇列,例如佇列b。
消費者消費完後把結果訊息壓入隊列b。
這樣原來的生產者就能獲得回傳結果了。

RabbitMQ中實現RPC的機轉為:

  • 客戶端發送請求(訊息)時,在訊息的屬性(MessageProperties,在AMQP協定中定義了14中properties,這些屬性會隨著訊息一起傳送)中設定兩個值replyTo(一個Queue名稱,用於告訴伺服器處理完成後將通知我的訊息發送到這個Queue中)和correlationId(此次請求的識別號,伺服器處理完成後需要將此屬性返還,客戶端將根據這個id了解哪條請求被成功執行了或執行失敗)

  • 伺服器端收到訊息並處理

  • 伺服器端處理完訊息後,將產生一條應答訊息到replyTo指定的Queue,同時帶上correlationId屬性

  • 客戶端先前已訂閱replyTo指定的Queue,從中收到伺服器的應答訊息後,根據其中的correlationId屬性分析哪條請求被執行了,根據執行結果進行後續業務處理

這裡面有指出生產者會監聽另一個replyTo的佇列,從中取得對應應答訊息觸發後續操作。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn