問題タブ [operational-transform]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
463 参照

meteor - Meteor で使用されている同時実行制御手法とは

私はMeteorにかなり慣れていませんが、面白いと思いました。

Meteor がリアルタイムで同時実行制御を行うために使用する基本的な手法またはアルゴリズムは何ですか? また、それが競合に対してどのように機能するのでしょうか? オペレーショナル トランスフォーメーション (OT) に基づいているのか、それとも他の何かに基づいているのか? また、Meteor のアーキテクチャを知っておくと役立ちます。

0 投票する
1 に答える
15033 参照

algorithm - OT と CRDT の違い

Operational Transform と CRDT の主な違いを簡単に説明してもらえますか?

私が理解している限り、どちらも分散システムの異なるノードで競合することなくデータを収束させるアルゴリズムです。

どのユースケースでどのアルゴリズムを使用しますか? 私の知る限り、OTは主にテキストに使用され、CRDTはより一般的で、より高度な構造を正しく処理できますか?

CRDT は OT よりも強力ですか?


私がこの質問をするのは、HTML 文書用の共同エディターを実装する方法を調べようとしていて、最初にどの方向を見ればよいかわからないからです。私は、ShareJS プロジェクトと、ブラウザ上でcontenteditables要素のリッチ テキスト コラボレーションをサポートしようとする試みを見ました。ShareJSのどこにも、そのためにCRDTを使用しようとする試みは見られません。

また、Google Docs が OT を使用していることもわかっており、リッチ ドキュメントのリアルタイム編集に非常にうまく機能しています。Google が OT を選択したのは、当時 CRDT があまり知られていなかったからですか? それとも今日も良い選択でしょうか?

データベースでこれらのアルゴリズムを使用するなど、他のユースケースについても知りたいです。Riak は CRDT を使用しているようです。OT を使用してデータベースのノードを同期し、Paxos/Zab/Raft の代わりにすることはできますか?

0 投票する
1 に答える
102 参照

microsoft-sync-framework - 同期フレームワーク: 単一のデータ (ファイル) を同じアプリケーションの複数のインスタンスで使用/同期する方法

現在、xml ファイルに状態を保存およびロード (シリアル化) できるアプリケーション (ダイアグラム エディター) があります。

ここで、このアプリケーションを Microsoft OneNote アプリケーションのように動作させたいと考えています。複数のユーザーが同じファイルにアクセスできる場所。

後で、(1) 何が変更され、誰が変更したか、(2) 競合があればそれを解決するオプションなど、他のことを強化する必要があるかもしれません。

これを解決する同期フレームワークについて知りました。これまでのところ、私はそれを試していません。

私が欲しいのは、

  1. 実質的に単一のファイルは、同じアプリケーションの複数のインスタンスで編集する必要があります。
  2. 以下を実行する dll (同期フレームワーク) が必要です。

    • ファイル処理の完全な責任を負います。
    • この dll を使用して、アプリケーションの各インスタンスは独自の変更を通知します。
    • アプリケーションの各インスタンスには、最近行われた変更 (いつ、誰が、どのような変更を行ったか) を検出する機能が必要です。

私の質問:

  1. 同期フレームワークはこの要件に適していますか?
  2. もしそうなら、これを表すデモアプリケーションはありますか?
0 投票する
1 に答える
11424 参照

algorithm - Google ドキュメントは編集の競合をどのように処理しますか?

私は、Google Docs に似た機能 (複数の人が同時に作業できるようにする) を備えた、独自の Javascript エディターを作成することをいじっています。私が理解していないことの1つ:

ユーザー A とユーザー B が 10 ミリ秒のネットワーク遅延で互いに直接接続されているとします。私は、編集が「インデックス 3 に「テキスト」を挿入」のように表される diff システム (Docs が行っていることを理解している) をエディターが使用していると仮定しています。

「xyz123」というテキストを含むドキュメントから始めましょう。

ユーザー A はタイムスタンプ 001ms でドキュメントの先頭に「abc」と入力し、ユーザー B はタイムスタンプ 005ms で「xyz」と「123」の間に「hello」と入力します。

どちらのユーザーも、結果が「abcxyzhello123」になることを期待しますが、ネットワークの遅延を考慮すると、次のようになります。

  • ユーザー B は、時間 011ms にユーザー A の「インデックス 0 に 'abc' を挿入」の編集を受け取ります。時系列の順序を維持するために、ユーザー B はユーザー B のインデックス 3 での挿入を元に戻し、ユーザー A の「abc」をインデックス 0 で挿入し、次にユーザー B のインデックス 3 での挿入を再挿入します。これは現在「abc」と「xyz」の間にあります。 、」したがって、「abchelloxyz123」が得られます
  • ユーザー A は、時間 015ms にユーザー B の「インデックス 3 に「hello」を挿入」の編集を受け取ります。ユーザー B の挿入がユーザー A の後に行われたことを認識し、インデックス 3 (現在は "abc" と "xyz" の間) に "hello" を挿入するだけで、"abchelloxyz123" となります。

もちろん、「abchello xyz123」は「 abc xyz hello 123」と同じではありません。

文字通りすべてのキャラクターに独自の一意の ID を割り当てる以外に、Google がこの問題を効果的に解決する方法を想像することはできません。

私が考えたいくつかの可能性:

  • ユーザー B が編集前に挿入ポイントを 1 ミリ秒移動した場合、まったく同じ問題が発生することを除いて、差分を含むインデックスを送信する代わりに挿入ポイントを追跡することは機能します。
  • ユーザー B に、「'xyz' の後に挿入」などの情報を diff で送信してもらい、ユーザー A がこれが発生したことをインテリジェントに認識できるようにすることもできますが、ユーザー A がテキスト「xyz」を挿入するとどうなるでしょうか。
  • ユーザー B は、これが発生したことを認識し (ユーザー A の diff を受信し、それが競合していることを確認すると)、ユーザー B の編集を元に戻す diff と、ユーザー B の "hello" "abc".length インデックスをさらに挿入する新しい diff を送信します。右。これに関する問題は、(1) ユーザー A がテキストに「ジャンプ」を表示すること、および (2) ユーザー A が編集を続ける場合、ユーザー B は継続的に差分を修正する必要があることです。修正する必要があり、複雑さが指数関数的に増加します。
  • ユーザー B は、最後に受信したタイムスタンプ付きの diff が -005ms か何かであるというプロパティを diff と共に送信できます。その後、A は B がその変更について知らなかったことを認識し (A の diff は 001ms であったため)、競合の解決を行うことができます。問題は、(1) ほとんどのコンピューターの時計がミリ秒単位で正確ではないことを考慮すると、すべてのユーザーのタイムスタンプがわずかにずれることと、(2) ユーザー A との遅延が 25 ミリ秒でユーザー B との遅延が 2 ミリ秒の 3 番目のユーザー C が存在する場合、ユーザー C が -003ms で「x」と「y」の間にテキストを追加すると、ユーザー B はユーザー C の編集を参照点として使用しますが、ユーザー A はユーザー C の編集については知りません (したがって、ユーザー B の参照点) 22msまで。共通のサーバーを使用してすべての編集にタイムスタンプを付ければ、これは解決できると思いますが、それはかなり複雑なようです。
  • 各キャラクターに一意の ID を与え、インデックスの代わりにそれらの ID を使用することもできますが、それはやり過ぎのように思えます...

http://www.waveprotocol.org/whitepapers/operational-transformを読んでいますが、この問題を解決するためのあらゆるアプローチを聞きたいです。

0 投票する
2 に答える
1025 参照

collaboration - Quillでリモートユーザーのカーソルと選択を表示するにはどうすればよいですか

私は短い間Quillを使用しており、共同編集を機能させることに集中してきました。これまでのところ順調に進んでおり、完全に機能する共同編集者がいます!

他のユーザーの選択範囲とカーソル位置を表示したいのですが、Quill でこの問題に適切にアプローチする方法が思いつきません。

私は基本的に、実際のドキュメント モデルにコンテンツを追加せずに、レンダリングされたドキュメントにマークアップを追加したいと考えています。これは可能ですか?どこから始めればよいですか?

0 投票する
1 に答える
90 参照

javascript - ServerSide Javascript と Python の統合

JSON配列を使用してサーバーとクライアントの間で状態を保存および転送するWebアプリを構築しています。「コラボレーション」機能を追加して、複数のクライアントが競合を引き起こすことなくjsonデータを同時に編集できるようにし、すべてのクライアントでデータがリアルタイムで更新されるようにしようとしています。

バックエンドでは python を使用しているので、 opencowebプロジェクトを見つけてとてもうれしく思いました。悲しいことに、それはもはや維持されていません。同様に、私はShareDBを見つけました。これは非常に優れたプロジェクトのようです。Python コードからサーバー側で ShareDB をスピンアップしたいのですが、サーバー側で JavaScript コードを実行するための最良の方法が何であるかがわかりません。この時点で、コマンド ラインから node を使用して実行することを検討していますが、javascript (Js2Py など) を実行できる Python ライブラリを使用する方が理にかなっているのかどうか疑問に思っています。サーバー側では、メイン フレームワークに python (トルネード) を使用している場合に、JavaScript をサーバー側のコード ベースに統合するための「推奨される」アプローチはありますか?