Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CRDTで始めるコンフリクトしないデータ同期

 CRDTで始めるコンフリクトしないデータ同期

Yuto Takamune

May 14, 2023
Tweet

More Decks by Yuto Takamune

Other Decks in Technology

Transcript

  1. CRDTで始めるコンフリクトしないデー
    タ同期
    s1290035 しんぶんぶん

    View full-size slide

  2. コンフリクトしないデータ同期を目指して
    ● 複数ノードのデータを同期したい!
    ○ 同時に同じリソースを編集しても整合性が取れるようにしたい
    ○ ネットワークの遅延とかがあっても不整合なく同期したい
    ● CRDT(Conflict-free Replicated Data Types)を使えばこれらの問題が解決できる
    ● FigmaとかはCRDTを独自に改造したものを使っている

    View full-size slide

  3. Strong Eventual Consistency(SEC)
    ● Eventual delivery
    ○ ある正しいレプリカに配信されたアップデートは、最終的にすべての正しいレ
    ○ プリカに配信される
    ● Strong Convergence
    ○ 配信した正しいレプリカは同等の状態を持つ
    ● Termination
    ○ すべてのメソッドの実行が終了する

    View full-size slide

  4. Eventual Consistency(EC)との違い
    ● ECはコンフリクトすることがあるため、なんらかの方法で解決しないといけない
    ● SECはそもそもコンフリクトしない

    View full-size slide

  5. CvRDTとCmRDT
    ● State-based なConvergent Replicated Data Type(CvRDT)
    ○ レプリカ自体を共有して merge していくタイプのCRDT
    ● Operation-basedなCommutative Replicated Data Type(CmRDT)
    ○ レプリカ間で操作を共有していくタイプの CRDT

    View full-size slide

  6. CvRDT
    ● レプリカ自体を共有してmerge していくタイプのCRDT
    ● レプリカのマージは可換かつ冪等
    ● 可換: どの順番でmergeしても同じ結果になる
    ● 冪等: 何回mergeの操作を適用しても同じ結果になる
    ● つまり: メッセージが失われたり、順番が違ったり、複数回受信されたりしても、最終
    的に同じ結果に収束する
    ● レプリカ全体を同期させるのでデータが大きくなると結構びみょい

    View full-size slide

  7. CmRDT
    ● レプリカ間で操作を共有していくタイプのCRDT
    ● 操作は可換
    ● つまり、どの順番で操作を適用しても同じ結果に収束する
    ● 冪等ではないので、CvRDTよりは通信の信頼性が求められる

    View full-size slide

  8. CRDTの具体例

    View full-size slide

  9. Grow-Only Set(G-Set)
    ● AddとLookUp操作のみをサポートしたSet
    ● Setへの追加は可換なのでCmRDTとして成立する
    ● merge(S, T) = S ∪ Tとすると、これは可換かつ冪等なのでCvRDTとしても成立す

    View full-size slide

  10. 今までのLTネタ

    View full-size slide

  11. ただ技術の解説しただけで終わりですか?
    今回は何も実装してないんですか???

    View full-size slide

  12. もちろんそんなことはないです

    View full-size slide

  13. TreeDocをRustで実装してみた話
    s1290035 しんぶんぶん

    View full-size slide

  14. TreeDocとは
    ● テキスト共同編集のためのCRDT(CmRDT)
    ● binary treeにテキストを保存していく構造
    ● atomと呼ばれる要素がNodeになる
    ● 各atomはPosIDという一意の位置識別子を持つ
    ○ PosIDにはRootからNodeへのPathが使われる
    ○ 右図の場合、たとえば dのPosIDは10
    ● 同じ位置に異なるatomを同時に挿入する可能性を考え、binary treeのNodeに
    binary treeを持たせるような構造になっている
    ● Deleteは、削除したNodeにtombstoneを持たせる仕組み
    引用: Nuno Preguiça, Joan Manuel Marquès, Marc Shapiro,
    Mihai Leția “A commutative replicated data type for cooperative
    editing”

    View full-size slide

  15. 今回実装したもの
    ● TreeDocの機能の一部をRustで実装
    ● Ropeデータ構造を独自に拡張した仕組みを使って、TreeDocを実際に使えるよう
    にした
    ● tombstoneを使った削除やbinary treeのミニノードは今回未実装のため、実は
    CRDTと呼べるところまでは実装できてない
    ● フロントエンドで動かしたかったので、wasmに変換してJSから呼び出した

    View full-size slide

  16. 参考文献
    ● Marc Shapiro, Nuno Preguiça, Carlos Baquero, and Marek Zawirski. Conflict-free replicated data
    types. In 13th International Conference on Stabilization, Safety, and Security of Distributed Systems,
    SSS 2011, pages 386--400. Springer LNCS volume 6976, October 2011.
    ● Marc Shapiro, Nuno Preguiça, Carlos Baquero, and Marek Zawirski. A comprehensive study of
    convergent and commutative replicated data types. Research Report 7506, INRIA, January 2011.
    ● Nuno Preguiça, Joan Manuel Marquès, Marc Shapiro, Mihai Leția. A commutative replicated data
    type for cooperative editing. 29th IEEE International Conference on Distributed Computing Systems
    (ICDCS 2009), Jun 2009, Montreal, Québec, Canada. pp.395-403, ff10.1109/ICDCS.2009.20ff.
    ffinria00445975f

    View full-size slide