我試圖消化服務結構體系結構模式及其最佳實踐。服務結構 - 是每個分區的有狀態服務單實例
用例:
我定義有狀態服務26個分區,並且在每個分區中,我存儲與相同的第一字母的詞。
- 1)這是否意味着我實際上有26個有狀態服務實例?
- 2)當有狀態服務之外,即在調用者中 - 我正在爲我的服務結構客戶端構造一個URI,指定我希望客戶端運行的分區ID。這是否意味着,一旦我處於有狀態服務(即服務客戶端實例化並稱爲有狀態服務)的環境中 - 我無法引用其他分區?
3)難道說一個狀態服務是工作單位,它需求知道操作哪個分區上,並不能做出了自己的決定?在這裏我指的是哪裏有狀態服務的RunAsync方法裏面,有底層可靠店電話例子很多,例如,代碼採取from this post:
protected override async Task RunAsync(CancellationToken cancelServicePartitionReplica) { var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, int>> ("myDictionary"); var partition = base.ServicePartition.PartitionInfo.Id; byte append = partition.ToByteArray()[0]; while (!cancelServicePartitionReplica.IsCancellationRequested) { // Create a transaction to perform operations on data within this partition's replica. using (var tx = this.StateManager.CreateTransaction()) { var result = await myDictionary.TryGetValueAsync(tx, "A"); await myDictionary.AddOrUpdateAsync(tx, "A", 0, (k, v) => v + append); ServiceEventSource.Current.ServiceMessage(this, $"Append {append}: {(result.HasValue ? result.Value : -1)}"); await tx.CommitAsync(); } // Pause for 1 second before continue processing. await Task.Delay(TimeSpan.FromSeconds(3), cancelServicePartitionReplica); } }
所以,也許我的發言3)是錯誤的 - 有狀態的服務可能在沒有人(服務客戶端)的情況下調用其內部存儲來將其稱爲externaly併爲確切的分區提供信息。 但是,上面的代碼如何決定將數據放入哪個分區?最重要的是,如何以後通過服務客戶端查詢數據,該服務客戶端應該提供確切的分區ID?
a)不是專家,但我認爲分區(在這種情況下)涉及如何在同一分區中的實例(技術上稱爲副本)之間共享數據(通過IReliableStateManager)。每個分區可以有兩個副本,因此副本A_1(在節點1上)和副本A_2(在節點2上)可以在彼此之間共享數據。但A_1無法與B_1分享數據b)我認爲您的問題可能有太多問題:) –