2012-02-14 48 views

回答

3

是的,您可以在OnStart方法中等待一段時間來初始化服務。

OnStart執行系統的初始化。如果您在進入角色的運行狀態之前需要設置並初始化一項服務,則需要在退出該方法之前在OnStart中初始化該服務。

角色環境將在您退出OnStart後繼續調用您的RoleEntryPoint的Run方法。調用下一個方法的確切時間是未知的。這也會將您的服務從RoleInstanceStatus.Busy移至RoleInstanceStatus.Ready,此時角色實例將開始接收流量。

據我所知,角色實例沒有初始化超時。 (另一方面,OnStop方法,當你的實例出於什麼原因關閉時,由於實際原因,執行完成的時間有限。不確定,但有一次我聽到了5秒或15秒。)

+0

有初始化超時。微軟服務部門告訴我,角色有15分鐘才能進入就緒狀態,否則其他更新域會被更新。這意味着您的所有角色都可以一次性降下來。我們的Azure應用剛剛被發現 - 在自動Azure操作系統升級期間,工作角色需要15分鐘才能完成啓動任務(我們的問題),然後Azure開始升級其他更新域中的角色。這意味着更新域中的角色以及我們的應用程序同時處於關閉狀態。 – Yoshi 2013-03-07 20:58:03

+0

操作系統升級的超時時間記錄在這裏http://msdn.microsoft.com/en-us/library/windowsazure/hh543978.aspx – sharptooth 2013-05-22 10:11:03

1

據我所知,當OnStart內部的角色狀態是Busy時,這意味着它向Fabric Controller報告它仍處於初始化階段。我認爲在OnStart中睡覺並不好或不好,但您可能需要考慮角色啓動超時。

我認爲更好的主意會把你的等待邏輯放在運行中帶有一些標誌,以便在你準備好之前它不能接受請求。

+0

不知道爲什麼你會推薦在'Run()'中輸入人工等待語句。您可以在'OnStart()'中完成所有設置,並且在準備好添加到負載平衡器之前不要離開該方法。 – 2012-02-15 04:56:46

+0

據我所知,將應用程序保留在OnStart將使部署狀態保持忙。我記得有一個超時的角色初始化。如果確定OnStart花費太長時間,Fabric Controller可能會報告部署失敗,我想。 – 2012-02-15 05:31:24

1

OnStart方法的缺點是執行其中的所有初始化。所以,在這個函數退出之後,你的實例應該是完全有效的。在你的情況下,我認爲在OnStart中稍微等一下是很好的。在此期間,角色將處於「忙碌」狀態,並且不會收到任何傳入的Web請求,但仍可以與存儲和數據庫進行通信。

在我們的項目中,我們有OnStart從Blob存儲下載所有必要的數據,解包並註冊它。然後我們檢查該角色是否健康,並且只有在離開OnStart方法之後。