2012-09-20 19 views
4

我在使用RabbitMQ讀取AMQP中的RPC-Model。本教程創建了一個臨時隊列,也是correlationId。臨時隊列是唯一的,那麼爲什麼我們需要correlationId?我是一個JMS的傢伙,在JMS我們做的請求/響應方式有兩種:RPC模型中的correlationId和臨時隊列 - AMQP

  1. 爲每個請求/響應

  2. 創建一個響應隊列和使用correlationId和消息選擇創建臨時隊列。

有人可以解釋爲什麼我們在AMQP RPC模型既需要臨時隊列和correlationId?看起來AMQP沒有類似消息選擇器的東西。我對嗎?

回答

6

正確的臨時隊列對於發出RPC請求的客戶端是唯一的。我們可以創建RPC客戶端有它使每一個獨特的請求,唯一的隊列,但是這將是低效的 - 看到的correlationID here第一款規定:

在上面,我們建議創建一個回調隊列提出的方法每個RPC請求。這是非常低效的,但幸運的是有一個更好的方法 - 讓我們爲每個客戶端創建一個回調隊列。

所以更好的方法是讓一個隊列讓RPC客戶端得到響應,並使用correlationId將RPC客戶端發出的請求與RPC服務器發回的請求進行匹配。

...在該隊列中收到響應,不清楚響應屬於哪個請求。那是什麼時候使用correlation_id屬性。我們將把它設置爲每個請求的唯一值。稍後,當我們在回調隊列中收到消息時,我們會查看此屬性,並基於此屬性,我們將能夠將響應與請求進行匹配。如果我們看到未知的correlation_id值,我們可以放心地丟棄該消息 - 它不屬於我們的請求。

所以引用RPC tutorial的摘要部分:

    當客戶機啓動時把它發送它設置REPLY_TO這是隊列名稱的RPC請求它創建一個獨特和唯一隊列
  • (所以服務器知道哪個隊列發送響應),並且還設置correlationId,它是每個RPC請求的唯一值,該請求被髮送到RPC隊列
  • RP C工作人員(或服務器)接收請求進程,然後使用reply_to值將響應發送回客戶端,同時還設置correlationId RPC客戶端等待響應,並且當它收到一個響應時使用對號到MATCH對請求的迴應