2017-02-22 37 views
0

在使用azure服務結構演員時,這是我最近發現的奇怪的事情 - 我無法更改分區的默認設置。如果我嘗試爲UniformInt64設置命名分區或更改低/高鍵,則每次在Visual Studio中構建項目時都會被覆蓋。這對於有狀態服務來說沒有問題,它只發生在演員身上。沒有錯誤,在事件日誌中,什麼都沒有任何記錄......我發現只有一個有關在互聯網上同樣的問題單參考 -無法更改演員的分區方案

https://social.msdn.microsoft.com/Forums/vstudio/en-US/4edbf0a3-307b-489f-b936-43af9a365a0a/applicationmanifestxml-overwritten-on-each-build?forum=AzureServiceFabric

但我還沒有看到任何解釋到 - 既不在MSDN上,也不在官方文檔中。有任何想法嗎?它真的是'設計'嗎?

P.S.

只執行Powershell腳本來部署應用程序的確允許我按照我希望的方式設置方案。仍然無法在VS中做到這一點令人沮喪。可能有一個很好的理由......應該是吧? :)

回答

1

可靠服務可以創建與不同的分區方案和 分區鍵範圍。 Actor服務器使用Int64分區 方案以及完整的Int64密鑰範圍將參與者映射到分區。

每個ActorId被散列到Int64,這就是爲什麼演員服務 必須使用具有完整Int64關鍵字範圍的Int64分區方案。 但是,自定義ID值可以用於ActorID,包括GUID, 字符串和Int64。

當使用GUID和字符串時,這些值被散列爲Int64。 但是,當向ActorId明確提供Int64時,Int64 將直接映射到分區而不進一步散列。這可以 用來控制分區演員被放置在。

Source

,如果你的分區命名此的actorId => PartitionKey翻譯策略不起作用。

+0

感謝您的回覆!是的,我知道ActorID被映射到特定的分區,但是,由於Actor是有狀態服務的擴展,爲什麼我不能做同樣的事情並改變方案?爲什麼我們不能創建一個將某個字符串作爲ID傳遞並將其映射到具有與該ID相匹配的名稱的分區的映射?爲什麼VS不顯示任何錯誤/警告並默默覆蓋我的設置而不給我任何線索? –

+0

如果您的演員姓名與分區名稱相匹配,您將有效地將演員實例數限制爲您的分區數。這與演員理論不太一致(通常你會有很多演員實例)。爲什麼VS不警告你,我不知道。你可以在這裏創建一個問題:https://github.com/Azure/service-fabric-issues/issues – LoekD

+0

謝謝!我有許多任務要均勻分佈在各臺計算機上,而且任務數量是可用節點數量的兩倍。所以我想到有一些分區被設置爲任務數量,當運行任務的時候,我會讓Actor使用給定任務名稱的ID進行實例化。因此,我可以保證我在給定時刻只有一個具有特定名稱的單個任務(參與者是線程安全的),並且由於分區均勻分佈在整個集羣中(默認情況下),我會知道任務是均衡。是否有意義? –