問題タブ [crdt]
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.
scalability - 競合のない複製データ型(CRDT)とPaxosまたはRaft
パクシやいかだの代わりにCRDTのようなものを使用するのはいつ良い考えですか?
nosql - Riak の G カウンター: 基礎となる vclock は同じデータを提供しませんか?
私はCvRDTを読んでいて、Riak がすでにRiak 2にいくつか追加していることを知っています。
私の質問は:すべてのオブジェクトに関連付けられてgcounter
いる基盤が同じ情報を記録しているように聞こえるのに、なぜ Riak は を実装するのでしょうか? 結果は、それぞれが同じ重要な情報を含む で保存されvclock
ませんか?gcounter
vclock
vclocks
現時点での唯一の推測は、Riak がの目的で実際に重要なトリミング情報gcounter
(つまり、インクリメントの数) をガベージ コレクションする可能性があるということです。
私は Erlang を特によく読めないので、Riakvclocks
がこれらの特殊なケースのデータ型を格納していると誤って想定していたのかもしれません。ただし、問題は、標準の Riak の上に記述された自家製のソリューションvclocks
にも当てはまります (したがって、永続化された各オブジェクトを継承します)。
編集:
それ以来、CvRDT をより実用的な方法で説明するために、次の記事を書きました。この記事では、上記で強調した冗長性についても触れています。
Conflict-free Replicated Data Types (CRDT) - 数学の少ないわかりやすい説明。
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 の代わりにすることはできますか?
akka - 特定の時間に確実にメッセージを処理する
チャット アプリケーションがあるとします。
クライアントはチャットにメッセージを送信し、その結果、一部のアクターに何らかのコマンドが送信されました。今、私は彼が書いたものをすぐに処理して、このチャットで他のユーザーが利用できるようにしたいので、このコマンドを処理します。同時に、このメッセージをチャット履歴データベースに保存する必要があることを自分自身 (俳優) に伝えたいのですが、今はそうではありません。データベースへの保存は 2 分ごとに行われます。クラッシュが発生した場合でも、とにかくデータベースに永続化できるはずです。
ワークフローは次のようになると思います:
- ユーザーがメッセージを送信
- チャット ルーム アクターは、このメッセージでコマンドを受け取りました
- このメッセージを全員にブロードキャストし、このメッセージをある種のキューに追加して、チャット履歴データベースに保持します
- 一部の持続コマンドは、2 分間のタイムアウトが経過したときに実行されます。まだ永続化されていないすべての受信チャット メッセージを到着順に収集します。
- すべてのメッセージでトランザクションを実行し、キューから削除します。
- 3 以降のどこかでクラッシュが発生し、メッセージが永続化されなかった場合は、再度永続化を試みる必要があります。それらが永続化された場合、二度とそれらを永続化しようとするべきではありません。
Akka でこのようなものを構築するにはどうすればよいですか? どの機能/パターンを使用する必要がありますか?
erlang - Riak max-counter
Riak の CRDT を使用して max-counter のような sth を実装して、Yokozuna で使用したいと考えています。私が持っていたアイデアは、Riak マップ、その中に 2 つのカウンター、1 つを変更し、もう 1 つを pre-commit フックで両方の最大値に更新することでした。しかし、Riak マップを更新してそれを行う方法を見つけることができないようです。ヘルプ/より良いアイデアはありますか?
erlang - postcommit フックで riak データ型を扱う
別のバケットのマップのカウンターをデクリメントする riak の postcommit フックを実装したいと考えています。しかし、私は riak データ型を扱うのに少し苦労しています。
ここから私が試みていriak console
ます:
product
バケットのデータ型は に設定されていmap
ます。保存されている各オブジェクトquantity
には、デクリメントしたいカウンターが必要です。
ただし、コミット前後のコンテキストでデータ型を扱うドキュメントやサンプル コードが見つかりません。(実際、あらゆる種類の例はほとんどありません)。私はriak_clientとriak_dt_mapのソースを読んでいますが、私は erlang を初めて使用するので、進歩が遅く、助けていただければ幸いです。
scala - Riak Datatypes: デフォルト値 vs 存在しないキー
Riak Datatype API では、存在しないキーとデフォルト値を区別できないようです。たとえば、次のように存在しないキーをクエリするとします。
0 を保持するカウンターを取得します。ここで、このキーに値 0 のカウンターを配置してクエリを実行すると、同じ結果が得られます。これら 2 つの異なる状態を区別する方法はありますか?
注: セットを操作する場合、確認できるコンテキストがあります。セットをフェッチしてコンテキストが null の場合、このキーの下にセットが存在しないことを意味します。ただし、カウンターはコンテキストを維持しないため、このトリックはカウンターには機能しません。
更新:以下の Dmitri の提案は、次の解決策につながります。
ただし、欠点は、追加のクエリを作成する必要があることです。
distributed-computing - 分散システムにおける CRDT とは?
私は分散システムの初心者であり、CRDT の概念について洞察を得ようとしています。私はそれが3つの表記法を持っていることを認識しています:
分散システムで CRDT を使用する例を教えてください。よろしくお願いします。