2016-05-27 39 views
1

我服務織物中創建的無狀態服務的特定副本。它有一個SingletonPartition,但有多個實例(InstanceCount在我的例子中是-1)。我怎樣才能達到一個無狀態的服務

我想使用此服務的特定副本通信。要找到所有副本的使用:

var fabricClient = new FabricClient(); 
var serviceUri = new Uri(SERVICENAME); 

Partition partition = (await fabricClient.QueryManager.GetPartitionListAsync(serviceUri)).First(); 
foreach(Replica replica in await fabricClient.QueryManager.GetReplicaListAsync(partition.PartitionInformation.Id)) 
{ 
    // communicate with this replica, but how to construct the proxy? 
    //var eventHandlerServiceClient = ServiceProxy.Create<IService>(new Uri(replica.ReplicaAddress)); 
} 

的問題是,有沒有超載用於ServiceProxy創造一個副本。還有另一種與特定副本進行通信的方式嗎?

編輯

我們正在建設的方案如下。我們有不同的運動部件和計數器信息:1個命名分區有狀態服務(有幾百個分區),1個int64分區有狀態服務和1個有狀態的角色。要彙總計數器信息,我們需要聯繫所有服務分區和角色實例。

我們當然可以扭轉這種局面,讓大家都送有計數單(分區)的服務。但是這會在正常流量中增加一個網絡呼叫(因此會增加開銷)。

相反,我們提出了以下幾點。提到的服務&演員被組合成一個可執行文件和一個servicemanifest。因此他們在同一個過程中。我們使用instancecount -1向所提到的服務& actors添加無狀態服務。所有計數器信息存儲在一個靜態變量中。無狀態服務可以讀取此計數器信息。 現在,我們只需要接觸到無狀態服務(它具有節點數量的上限)。

回答

1

只是爲了得到一些術語閃開第一,「複製品」僅適用於,你有一個服務的每個分區的唯一副本集和複製它們之間的狀態HA狀態的服務。無狀態服務只有實例,所有這些實例都是相同和相同的。

現在回答你的問題實際:ServiceProxy沒有連接到部署的無狀態服務的特定實例的選項。您有以下選項:

  • 主副本:連接到有狀態服務分區的主副本。
  • 隨機實例:連接到無狀態服務的隨機實例。
  • 隨機副本:連接到隨機副本 - 無論其角色如何 - 有狀態服務分區。
  • 隨機輔助副本 - 連接到有狀態服務分區的隨機輔助副本。

例如爲:

ServiceProxy.Create<IMyService>(serviceUri, partitionKey, TargetReplicaSelector.RandomInstance) 

那麼,爲什麼沒有選擇連接到特定的無狀態的服務實例?

那麼,我會轉過來問這個問題,問你爲什麼要想要連接到一個特定的無狀態服務實例?根據定義,每個無狀態實例應該是相同的。如果你保持某種狀態 - 比如用戶會話 - 那麼現在你是有狀態的,應該使用有狀態的服務。

你可能認爲的聰明決定連接到的實例來進行負載平衡,但同樣因爲它是無狀態的,沒有實例應該只要請求均勻地分佈時做更多的工作比任何其他。爲此,服務代理具有隨機分配選項。

考慮到這一點,如果你仍然有一些理由來尋找特定的無狀態服務的情況下,你總是可以使用不同的通信棧 - 如HTTP - 做任何你想要的。

+0

好的,返回實例的API被稱爲GetReplicaListAsync,這是混淆來自的地方。我們用你最後的建議去了:我們使用HTTP通信。我編輯了我的問題來描述我們正在構建的場景。 –

+0

@Vaclav Turecek如果我想在我的無狀態服務中公開WebSockets端點,該怎麼辦?那麼這些實例就不一樣了,因爲我可以有更多或更少的連接到它們中的每一個。然後,我可能想推動更新從演員到無狀態服務,所以數據通過WebSockets路由到客戶端 – Helikaon

+0

我想我可以使用Actor事件和無狀態web api可以訂閱他們 – Helikaon

1

「好吧,我會繞過這個問題,問你爲什麼要連接到一個特定的無狀態服務實例?」如果您有多個(3次)無狀態的服務實例均具有WebSocket連接到不同的客戶端

一個例子是,假設每500。如果可以直接連接到一個特定的實例(我認爲這是可能的,因爲我可以使用FabricClient查詢這些實例),所以我想發送同一消息的所有1500(500x3)用戶,我可以發送向每個實例發送一條消息,將其重定向到所有連接的客戶端。

相反,我們必須拿出任何解決方法多的:

  1. 是否所有實例連接到某些事件觸發系統,使他們能夠觸發傳入的消息,例如Azure事件中心,Azure服務總線,RedisCache。

  2. 主機額外的端點,這裏所提到的,這使得3個端點公關服務實例:WCF,WebSocket的,HTTP。

  3. 更改爲有狀態的分區服務,不持有任何國家或任何副本,但只允許調用分區。

目前具有RedisCache使遷移從遠一些嚴重的問題,並且想避免外部依賴,如事件集線器和服務總線只爲這個場景。

發送許多消息,每個第二,不必調用HTTP時,這將給額外的開銷,然後該請求需要轉換到網頁套接字的上下文。