「強い最終的な一貫性」という概念に出くわしました。 「最終的な整合性」よりは強いが、「強い整合性」よりは弱いはずですか?誰かがこれらの3つの概念の違いを適用可能な例で説明できますか?
http://en.wikipedia.org/wiki/Eventual_consistency#Strong_Eventual_Consistencyhttp://en.wikipedia.org/wiki/Conflict-free_replicated_data_type
どうもありがとう。
免責事項:以下のテキストは、最終的な一貫性、強い最終的な一貫性、および強い一貫性の違いについて大まかな考えを示すものです。しかし、それらは何らかの形で単純化しすぎています。だから塩の粒でそれらを取る;)
まず最初に:consistencyについて話すとき、異なるエンティティ(ノード)が何らかのデータオブジェクトの独自のコピーを持っているシナリオを参照します。現在、各ノードが独自のコピーを更新できるために競合が発生します(たとえば、各ノードが何らかのノードに接続され、そうするように要求しているため)、異なるノードからデータを読み取ると、異なる値が表示されます。これは、最終整合性(EC)、強い最終整合性(SEC)、および強い整合性(SC)が作用する場所です。
最終的な整合性競合が発生する可能性がありますが、ノードはそれらの競合を解決するために互いの変更を通信するため、やがて最終的な値に同意します。したがって、一定期間データに変更が適用されない場合、すべてのノードがデータ値に同意する(つまり、最終的に同意する)ため、データのリーダーは最終的に同じ値を見ることになります。
例:2つのノードAおよびB(nAおよびnB)には、文字列のコピーが1つずつあり、操作で更新されますread()
およびwrite(string)
。それぞれに独自のクライアント(cliAおよびcliB)があるとします。最初は両方のノードが同じ値「Joe」を格納しているが、ある時点でnAがそれを「Frank」に更新するとします(write("Frank")
を呼び出します)。次に、nAは、値が更新されたことをnBに通知します。両方の値が異なるため、競合が発生しますが、いくつかのポリシー(last-write-winsなど)を使用して解決できるため、nBは最終的にレコードを「Frank」にも更新します。競合が解決される前に、cliAおよびcliBには異なるバージョンのデータが表示されます(read()
op結果は異なる)が、最終的には両方が再び同じ値を見ることになります。
両方のノードが同時に値を更新する場合、競合の解決は依然として可能ですが、より複雑であることに注意してください。これがSECが輝くところです。
強力な結果整合性これはECの特殊なケースであり、特定のデータ型にのみ有効です。
共有されるデータオブジェクトがカウンターであり、add(int value)
およびsubstract(int value)
操作によって更新が行われると仮定します。この場合、更新を適用する順序は重要ではありません!したがって、nAとnBの両方が0のカウンター値で始まり、nAがadd(10)
を実行し、 nBはsubstract(5)
(同時に)を実行し、競合解決を気にせずに更新操作を相互に送信するだけでよく、最終的には、同じ値(対照的に、ECの前の例では、何らかの競合解決が必要になる可能性があることに注意してください)!
残念ながら、SECは特定のプロパティ(可換性など)を持つ特定のデータタイプと操作にのみ適用できます。このようなデータ型はConflict-free Replicated Data Type(CRDT)で示されます。
強い一貫性他の2つとはかなり異なります。ここでは、更新操作時に、すべてのノードが新しい値に同意してから、新しい値をクライアントに表示する必要があります。これにより、更新はすべてのクライアントに「同時に」表示されるため、常に同じ値が読み取られます。現在、これにより、更新操作でのいくつかのブロックの要件が導入されています。 ECとSECの両方で、ローカルコピーが更新されるとすぐに更新操作が終了しました(その後、操作は他のノードにブロードキャストされました)。ここでは、すべてのノードがデータ値に同意するまでクライアントの更新は戻りません。これが行われている間、そのデータのコピーへのすべてのアクセスは「ロック」されます(他のクライアントの読み取りはブロックされます)。 ECの例では、cliAがwrite("Frank")
を実行すると、更新が合意されるまでcliAはブロックされますnAとnBの両方で、両方のcliAに対して表示されますおよびcliBを同時に使用します。つまり、read()
操作はそれ以降同じ値を返します。