2015-06-16 57 views
1

我試圖解決在Azure服務總線上創建多個隊列(即每月一個隊列)的問題。隊列中的消息包含有關客戶賬單的信息。隊列創建這樣的:在創建隊列從多個具有工作角色的動態隊列接收Azure服務總線消息

/// <summary> 
/// Creates a new queue on Azure Service Bus 
/// </summary> 
/// <param name="queueName">string</param> 
/// <returns>string (name of created queue)</returns> 
public string CreateNewQueue(string queueName) 
{ 
    try 
    { 
     NamespaceManager manager = NamespaceManager.Create(); 

     if (!manager.QueueExists(queueName)) 
     { 
      manager.CreateQueue(queueName); 

      return queueName; 
     } 

     return string.Empty; 
    } 
    catch (Exception e) 
    { 
     Logging.Instance.Fatal(e.ToString()); 
     return string.Empty; 
    } 
} 

後,與計費信息(僅比林斯的數據庫ID,雖然)約3.000消息添加到隊列中。

爲了處理隊列,我想使用Azure Worker角色。我創建了一個Azure服務項目並將一個Worker Role with Service Bus Queue輔助角色添加到項目中。

現在,在Worker角色的Run()方法,「只有」一個隊列使用(從示例代碼獲取):

// The name of your queue 
const string QueueName = "ProcessingQueue"; 

我已經得到了我的工作對一個感覺在這裏通過爲每個計費任務創建一個新的隊列來達到這個標準:-)然而,當然需要一個新的隊列,因爲每個月跟蹤每個計費任務至關重要。

有什麼辦法可以將工作者角色與前面提到的動態創建的隊列相結合?

在此先感謝。

回答

2

我建議你在這裏非常「違反規範」,因爲我看不出如何添加新的隊列可以讓你跟蹤從一個月到下一個月的消息。一旦消息成功發送到隊列,並且一旦成功接收並在工作者角色中的隊列中處理消息,則擁有單個隊列並記錄消息(可能記錄到DocumentDb實例?)會更有意義。

如果你絕對必須有單獨的隊列,我能想到的,你可以使用兩種方法:

  1. 保持在服務配置隊列的名稱;在每個月的月底,停止工作者角色,使用「新月」隊列的名稱更新服務配置並重新啓動工作者角色。這有其明顯的侷限性,並不是正確的方式去恕我直言。
  2. 爲隊列提供一個已知的名稱(例如'billing- [MONTH]'),其中[MONTH]是您可以在運行時從DateTime計算出的值(例如'billing-january','billing-august','billing十二月「等);在您的工作角色運行循環中,您可以根據新的隊列名稱動態創建偵聽器並輪詢隊列。

替代,建議的方法

一種選擇是考慮尋找服務總線主題和訂閱。您可以擁有一個「賬單」主題,每個月都有一個訂閱(「一月」,「二月」,「三月」等)。工作人員角色將監聽每個訂閱,並只接收在「二月」例如。消息創建者將發送給單個主題「帳單」,將消息「BillingMonth」中的一個屬性標記爲「1月」 - 然後將由「1月」訂閱訂閱。

有關服務總線主題的和預訂的詳細信息,請參閱https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/

+0

謝謝你的建議,尼克。我們將任務存儲在數據庫中,併爲每個添加了創建任務ID的任務創建一個新的隊列。 I.e .:「billingTask1」,其中1是ID。目前正在測試它,它似乎按照我們的願望工作。但是,我們完全跳過了工作者角色的使用,只是簡單地拉動了整個隊列,並開始使用'Message.Complete()'和'Message.Abandon()'處理帳單。 –

相關問題