CRDT
コンフリクトせず、複製可能なデータ
ネットワーク上に異なるバージョンのデータ(レプリカ)を存在させる
足し算など
操作を送り合う
atSource (prepare): ローカルレプリカのみで実行される。操作と現在の状態を調べ、操作を表現するためのメッセージを生成する
downstream (effect): リモートで適用される
操作が可換である必要がある
操作列がすべて到達しないと収束しないので、操作が確実に&一度だけ伝わるような信頼性の高いメッセージング機構が必要
https://scrapbox.io/files/656c3fec54b4760025e7a319.png
全体は$ (S, M, Q)のトリプルから構成される
$ M: Mutatorの集合。Mutator $ m \in Mは、状態$ X \in Sを受け取り、新しい状態$ X' = m(X)を返す Mutatorはインフレーションするように定義される。$ X \sqsubseteq m(X)が成立する Mutator: 例えばカウンタならinc(), dec()など
$ Q: クエリ関数の集合。
マージするときに、コンフリクトしているかどうか判定するために論理時計が使われている?kekeho.icon LWW Registerとか、一部のCvRDTはそうっぽいなkekeho.icon
アプリケーション
カウンタ
足し算(G-Set: Grow-only Set) 集合
Map
Register
Graph
CRDTはNon-adversarial(非敵対的)なシナリオで有効
解説
https://www.youtube.com/watch?v=x7drE24geUw
実装
アプリケーションで使われているCRDT
注意
CRDTsは書き込みをConflict-freeにしているだけで、読み込みは"annoying"であることが指摘されている
その他
A comprehensive study of CRDTsのまとめ
Introduction
多くの研究では、Faultがあっても、Global total orderを維持することに重点を置いている レプリカは、非同期で操作を適用し、他のレプリカに送信する
バックグラウンドにあるコンセンサスアルゴリズムがコンフリクトを解消する
ネットワークの分断(P)にもかかわらず、データのAvailabilityを高めることができる
ハイパフォーマンス
CRDTはコンセンサスいらず
続きを書こうと思ったけど、めんどくさくなってしまって諦めたkekeho.icon