0

好日子,從Web角色應用配置到工人的角色實例

我想問已經撕裂我的心一會兒的概念問題。這裏可能沒有正確或錯誤的答案,但我希望能更好地理解我的選擇。

情況: 我有一個Windows Azure應用程序。它由一個具有一個實例的ONE Web角色和一個具有兩個實例的工作者角色組成。

主要關注工作者角色。它實現Quartz.NET調度程序,執行從CRM系統獲取信息的任務,從中創建表並將其上傳到FTP服務器,例如每8小時一次。很簡單,沒有什麼幻想。

如果有人需要它在8小時的間隔內運行,則Web角色用於手動觸發作業。簡單的用戶界面,幾乎一個按鈕。

但是我希望有可能從Web角色更改工作角色的一些配置選項。例如目的地FTP服務器的憑證和作業的時間表,例如讓它每小時運行一次而不是8小時。如果角色脫機,配置不需要保留。目前配置是靜態類中的一個。

這似乎不是一個問題,如果我運行一個輔助角色實例:例如,我會通過隊列發送Web角色的消息並更改一些靜態變量。但令我困惑的是,消息隊列只能由一個角色實例提取,而不能同時實現。所以我最終會讓這項工作每隔8小時運行一次,每小時運行一次。

有什麼辦法可以通知兩個實例配置需要改變嗎?

回答

1

有幾種方法可以實現這一點。除了@Gaurav建議的內容外,讓我提供兩個:

  1. Windows Azure配置設置。如果您將ftp服務器名稱和時間間隔存儲爲配置設置,然後更改配置,則每個角色實例都可以捕獲並處理事件,並根據新設置採取相應措施。
  2. 服務巴士pub/sub。您可以讓每個角色實例訂閱配置更改主題。然後,無論何時您做出更改,都會將更改發佈到主題,並且每個實例(即訂閱者)都將收到該消息並採取相應的行動。
+0

謝謝!關於選項一:該方法是否會定期檢查「RoleEnvironment.Changing」事件? 我寧願不使用服務巴士,因爲如果我理解正確,它會帶來額外的成本,我寧願將它們保持在最低限度。 – 2012-08-04 09:17:41

+0

你只需要設置一個事件處理程序並等待它被調用。沒有循環。你只需要仔細編碼你如何處理它(或者乾脆讓你的角色實例重新啓動)。更多信息[這裏](http://msdn.microsoft.com/en-us/library/windowsazure/gg432963.aspx)和[這裏](http://technet.microsoft.com/en-us/library/microsoft .windowsazure.serviceruntime.roleenvironment.changing)。 – 2012-08-04 13:26:08

+0

非常有意義。這就是我將要做的。再次感謝你。 – 2012-08-05 19:52:09

0

一種可能性是在您的工作者角色實例的消息中執行「PEEK」,而不是「GET」消息。這樣消息將對所有實例保持可見。很顯然,挑戰在於何時刪除該消息。其他選擇是爲每個工作者角色實例創建一個單獨的隊列(您可以命名隊列,以便每個工作者角色實例實際上會從該實例的隊列中獲取消息,例如,如果您的worker角色實例稱爲WorkerRole1_IN_0,WorkerRole1_IN_1,那麼您可以將你的隊列命名爲workerrole1-in-0,worker-in-1等)。只想大聲:)

+0

這也是有道理的,我正在考慮這是一種可能性。唯一的問題是,這不是一個非常優雅的解決方案,因此需要對所添加的每個實例的代碼進行更改。儘管如此,我不太可能再使用兩種以上的產品。 – 2012-08-04 09:21:11