2016-06-12 119 views
1

我試圖消化服務結構體系結構模式及其最佳實踐。服務結構 - 是每個分區的有狀態服務單實例

用例:

我定義有狀態服務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?

+0

a)不是專家,但我認爲分區(在這種情況下)涉及如何在同一分區中的實例(技術上稱爲副本)之間共享數據(通過IReliableStateManager)。每個分區可以有兩個副本,因此副本A_1(在節點1上)和副本A_2(在節點2上)可以在彼此之間共享數據。但A_1無法與B_1分享數據b)我認爲您的問題可能有太多問題:) –

回答

2

有狀態服務'實例'實際上是複製品。您可以爲每個分區配置多少副本(用於性能,擴展,高可用性災難恢復&)。只有一個副本(主)寫入。所有副本(輔助文件和主文件)都可用於讀取。副本包含您的數據集的分片。 分區1中的數據不與分區2共享。

呼叫有狀態服務的客戶端需要自行決定要與哪個分區進行通信。服務只能在自己的分區中讀/寫(直接)。

更多信息here