2017-03-04 61 views
1

我是新來的RabbitMQ,我有點迷失在文檔中。RabbitMQ使用自定義標題來存儲消息參數

目前作爲一個例子,我試圖構建一個偵聽隊列的小型郵件服務器。但我有點卡在我應該把我的服務的參數(目標,主題,...)

我應該把它們放入一些編碼格式頭建設,如下面的例子:

string message = "Hello World!"; 
var body = Encoding.UTF8.GetBytes(message); 

var properties = new BasicProperties(); 
properties.Headers = new Dictionary<string, object>(); 
properties.Headers.Add("destination", "[email protected]"); 

channel.BasicPublish(exchange: "", routingKey: "sendmail", basicProperties: properties,body: body); 

是否使用頭提供了額外的好處?例如,可以過濾發送到特定目的地的郵件嗎?

回答

4

我不會使用您正在嘗試執行的操作。在我看來,這些信息屬於信息的正文。

看看這樣說:

消息的主體應該包含您需要完成要求的工作一切。在這種情況下,它將是發件人,主題,電子郵件內容等。

另一方面,標題是有關AMQP消息的數據位,而不是消息內容。

這裏有很多潛在的困惑與你的工作做「電子郵件」。 AMQP消息與電子郵件之間的術語重疊太多。

這樣說,我會選擇一個不同的工作示例:計算fibonacci序列。

在這種情況下,您通過rabbitmq發送的消息將包含諸如先前計算多少斐波那契位置以及之後要發送多少位的信息。

例如,你可能會(在這種情況下,JSON)發送類似這樣的消息:

{ 
    start: 1, 
    take: 3 
} 

,因爲它會在第一個位置,並返回從序列3項本應產生的1, 1, 2結果。

使用您的具體問題和邏輯:我應該將starttake屬性放入消息的標題中嗎?

沒有。

如果我這樣做,那意味着我的消息是空的,因爲所有關於要完成的工作的信息都將包含在標題中。

當我以這種方式觀察它時沒有任何意義,因爲現在沒有要發送的消息...只有標題。另一方面,如果我在消息正文中保留這兩點數據,則頭文件將變得更加有用,因爲它可以發送關於AMQP消息本身的元數據......而不是有關消息內容的信息,但關於消息的想法的信息。

在這種情況下,我說我想從斐波那契序列返回項目。換句話說,我參與了RPC(遠程過程調用)並期望返回值。

AMQP不直接支持返回值。然而,我可以做的是在隊列中填入隊列名稱並將結果發送到隊列中。那麼請求斐波納契數字的代碼可以監聽該隊列並獲得結果。

所以我可能會在發送消息時,做這樣的事情:

var properties = new BasicProperties(); 
properties.Headers = new Dictionary(); 
properties.Headers.Add("return-queue", "fibreturn"); 

這裏我設置了一個「返回隊列」頭 - 對消息或請求信息在這種情況下的信息 - 在標題裏面。處理fibonacci序列的代碼將讀取此頭並將響應發送回該隊列。

這是一個更好的使用標題,因爲它使標題存儲有關消息的信息......在這種情況下,應發送響應。儘管如此,標題並不包含有關要完成的實際工作的信息。即全部直接存儲在消息體中。


p.s.我故意不使用像您通常應該那樣的「回覆」屬性來執行RCP。我以此爲例說明爲什麼你不應該把你的「目標」放在標題中。爲了更好地實現斐波那契序列的想法,請參閱RMQ文檔以及它如何正確使用「回覆」https://www.rabbitmq.com/tutorials/tutorial-six-dotnet.html

-1

無論你使用什麼,從AMQP的角度來看,它只是字節。所以對你來說更容易。例如,在JSON中,您可以使用以下字段:to,cc,bcc,主題,正文,附件等。