2011-10-16 85 views
0

我有一個包含Azure中的多個託管服務的應用程序。兩個是網絡角色,一個是工作者角色。問題是,現在需要溝通兩個角色。一個是用作管理界面的網絡角色。另一個是工作者角色。管理界面需要發出命令,如暫停任何正在運行的作業,報告狀態等。第二個Web角色只是一個與前兩個無關的站點。Azure體系結構和角色通信

(只是爲了作序,我想確保我的使用Azure的術語是正確的):

  1. 託管服務:一個藍色的 '應用'。有兩個部署,生產和分期的多重角色

  2. 部署:所有角色的具體情況,無論是在生產或分期,通過一個外部端點(* .cloudapp.net)

  3. 的影響:一個'工作',無論是網絡角色還是工作者角色。

  4. 比如:虛擬機的該服務的角色

也驗證:是否可以將角色添加到現有的託管服務?也就是說,如果我從一個解決方案部署2個角色,我可以從另一個解決方案中的另一個部署中添加第三個角色?

因爲每個角色都在自己的託管服務中,所以會帶來一些挑戰。這是我在他們如何通信的選項的理解:

  1. 服務總線:這似乎是從架構的角度來看是最好的。每個託管服務都可以將WCF服務連接到服務總線,並且管理員可以向輔助角色發出命令。缺點是這是非常昂貴的。內部終點:如果考慮成本,這似乎是最好的。缺點是您必須一次部署所有角色,並且Web角色不能擁有唯一的地址。從外部訪問這兩個Web角色的唯一方法是使用端口轉發。據我所知,從一個解決方案部署2個角色,從另一個角色部署1個角色是不可能的?

  2. 外部WCF服務:每個組件可以在單獨的項目和單獨的託管服務中。缺點是現在有一個外部可見的管理服務。

  3. 隊列/表存儲:管理員可以將命令寫入Azure隊列,並且工作角色可以將他們的響應寫入表存儲。這對於生成報告來說似乎很好,但對於發佈同步命令似乎並不好。

應該爲多個服務「應用程序」提供服務的多個角色都進入相同的Azure託管服務嗎?如果從邏輯的角度來看它是最有意義的,那麼我會很樂意去用#2來處理端口轉發。非常感謝。

回答

1

首先,您的定義看起來很不錯,我認爲您很好地理解了這個問題。

同樣在每個部署中,每個外部端點只能分配給一個角色。所以如果你想在端口80上運行兩個站點,那麼他們需要是in the same role。這就像在IIS上使用相同端口設置兩個站點一樣(這正是您正在使用的)。這些站點使用主機標題進行區分。如果你不想這麼做,或者你想單獨部署這些站點,那麼你就需要將你的獨立站點放在它自己的服務/雲項目中。

對於通信部分,您錯過的一個選項是服務總線隊列。微軟已經發布了一個library using service bus queues that is specifically designed for inter-role communication

除此之外,關於你的觀點的額外評論: 你是正確的內部終結點是最便宜的方法,但你會自己動手。當然,它可以設置WCF服務來偵聽這些內部端點。

外部WCF服務可能正常工作,但是如果您有多個角色實例,則所有WCF調用都將通過負載均衡器,並且只會將消息發送到其中一個實例。您需要進行多次調用才能確保所有實例都收到該消息,即使如此,如果沒有其他反饋方法,您也無法確定它是否能夠正常工作。

存儲隊列遭受類似的問題。如果您有兩個實例並希望它們都收到相同的消息,則無法保證會發生這種情況。

+0

感謝您的回覆。我沒有充分考慮外部端點和隊列的限制。我打算以正確的方式進行,並使用服務總線進行服務通信,並使用內部端點來實現每個角色的實例。 – mfanto