2016-06-12 1 views
1

サービスファブリックのアーキテクチャパターンとそのベストプラクティスを消化しようとしています。service fabric - ステートフルなサービスです。パーティションごとに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)間違っている - ステートフルなサービスは、誰か(サービスクライアント)が外部に呼び出すことなく、正確なパーティションの情報を提供することなく内部ストレージを呼び出すことがあります。 しかし、上記のコードがデータを入れるパーティションを決定する方法は?そして、最も重要なのは、正確なパーティションIDを提供するサービスクライアントを介してそのデータを後でどのようにクエリするかです。

+0

a)専門家ではありませんが、パーティション分割(この場合)は、同じパーティション内のインスタンス(技術的にはレプリカと呼ばれる)間でのデータの共有方法に関するものです。パーティションごとに2つのレプリカを持つことができるので、レプリカA_1(ノード1)とレプリカA_2(ノード2)は互いにデータを共有できます。しかし、A_1はB_1とデータを共有できませんでした。b)あなたの質問にあまりにも多くの質問があるかもしれないと思います。 –

答えて

2

ステートフルサービスのインスタンスは、実際にはレプリカです。どのパーティションにもいくつのレプリカがあるかを構成します(パフォーマンス、スケーリング、高可用性の場合は&ディザスタリカバリ用)。 1つのレプリカ(プライマリ)だけが書き込みを行います。すべてのレプリカ(セカンダリとプライマリ)を読み取りに使用できます。レプリカにはデータセットの断片が含まれています。 パーティション1のデータはパーティション2と共有されません。

ステートフルサービスを呼び出すクライアントは、通信するパーティションを決定する必要があります。サービスは、自分のパーティションで直接読み書きしかできません。

詳細情報here

関連する問題