問題タブ [eventual-consistency]
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.
database - べき等増加演算子を使用した最終的に一貫性のある分散データベース?
スカラー値に対するべき等操作をサポートする、分散型の高可用性、最終的に一貫性のあるデータベースはありますか?
通常の更新を使用すると、異なるノードに 2 つの異なる値が存在する可能性があり、どちらの値も正しくない可能性があります。これは、両方のトランザクション値で金額を増やす必要があるためです。
コマンドの増加(キー、属性[列]、差分)を送信できる分散データベースはありますか? そのようにして、2 つの異なるノードが異なる値で増加した場合でも、増加操作の結果整合性が得られます。これは、その増加が他のレプリカに伝播するためです。
Cassandraのような高可用性データベースでは機能しないため、条件付き更新については話していません(そのため、その機能はありません)。アトミックな増加操作に興味があります。
ありがとう。
PSべき等増加の場合、同じlock_keyで同じコマンドをすでに受け取った場合、dbが増加しないように、コマンドを増加させます(キー、属性、差分、ロックキー)
tl;dr:
分散 AP 種類のデータベースで正確なカウンターを作成する方法はありますか? 2 つの問題: 1) カウンターを増やす操作を送信して応答が得られない場合、その要求を再度送信しますが、カウンターを 2 回増やしたくありません。2) そのカウンターが別のレプリカで同時に更新された場合、値を上書きするのではなく、最終的にこの増加を結合したいと考えています。sdfsdfas は、重複した更新を破棄するために使用される文字列です。この種のコマンドを複製するデータベースはありますか?
riak - Riak は結果整合性があると言う人がいる理由
Riak では、デフォルトでデータ バケットが 3 つの異なるノード (N=3) に複製されます。また、成功したと見なされる前に読み取りまたは書き込み要求に応答する必要があるレプリカの数は 2 ノード (R=2、W=2) です。
N が小さいか R+W に等しい場合、Riak は強整合性を提供します。したがって、これらのデフォルト値により、Riak は (MySQL のように) 強力な一貫性を提供します。Riak は強整合性ではなく、結果整合性を提供すると言う人がいる理由が理解できません。
domain-driven-design - 集計は強く一貫している必要がありますか?
私がDDDで読んだことはすべて、集合体内の状態が強く一貫している必要があることを意味します。
これは、冗長性が必要な場合は、強一貫性のあるレプリケーション(2PC、3PC、Paxosなど)のみを使用できることを意味します。
マルチマスターやマスタースレーブのような結果整合性のあるレプリケーションを使用できますか?それらを使用した場合、DDD用語でまだ「集計」されているものはありますか?これは一般的なことですか?
locking - 結果整合性システムと従来の ACID システムの混在
結果整合性システムと従来の ACID システムを混在させるパターンはありますか?
ACID のようなトランザクションを必要とするメインフレーム上の一部 (少なくとも 2 つ) のレガシー システムにデータを保存したいと考えています。これらのメインフレーム データベース (OldWorld と呼びましょう) は、同じプロセス内の同じトランザクション マネージャーの下で実行されているため、メインフレーム システムの一貫性は問題ありません。
非メインフレーム環境 (これを NewWorld と呼びましょう) で mainframe-tm および ACID 対応のリレーショナル データベースを使用して XA-Transactions を処理できるトランザクション マネージャーがあります。しかし、私は XA-Transaction を使用したくありません。これは、メインフレーム側で実行時間の長いロックで問題が発生することが多く、多くの場合、両方の世界ですべての ACID 機能を必要としないためです。私は常に一貫したメインフレームを望んでいます (OldWorld のすべてのデータは OldWorld 内で一貫しています)。NewWorld System は、メインフレーム側からデータを読み取る際に、不整合データ (新旧の不一致) を処理できます。OldWorld にデータを格納するために使用される操作は簡単で、機能的に失敗しない「追加のみの操作」を節約できます (技術的に失敗する可能性がありますが、これは常に一時的な失敗である必要があります)。
event-handling - CQRS を使用しないドメイン イベントとバージョン管理
こんにちは、結果整合性を取得する方法がわからない次のシナリオがあります。
- ユーザー 1 は、タスク ベースの UI を使用して顧客名を変更します
- アグリゲートでの App Service 呼び出し操作
- 顧客名が変更された場合のアグリゲート ファイア イベント
- bus は nservicebus を使用してメッセージを送信します
- NServicebus サービスの停止
- ユーザー 2 は集約を取得し、変更アドレスを呼び出します
- 呼び出された集計操作
- 発生したドメイン イベント
- バスに乗せられたメッセージ
- バスの再起動
- メッセージ 2 が最初にピックアップされました
- メッセージ 2 が処理され、その他の境界付きコンテキストが新しいアドレスで更新されました
- メッセージ 1 がピックアップされましたが、順序が間違っています
- 今、何が起きた
13 では、イベントで集約のバージョンを渡すと楽観的同時実行エラーが発生しますか?
その場合、Message 1 new が他のコンテキストのオブジェクトに適用されます。一貫性を維持するにはどうすればよいでしょうか。
これが、ドメインにイベントを適用することを妨げている問題です。すべてのヘルプ歓迎。
本質的なアイデアは、別のコンテキストで別の集約を更新することです。私はこれの並行性の技術にこだわっています。
コマンドハンドラやコマンドがバスにプッシュされるという意味で、イベントソーシングや CQRS は使用していません。変更したくない既存の設計があるため、非同期で発生させたいのはイベント処理だけです。
ブレア
python - GAE: 結果整合性を待つ時間は?
多数のエンティティを作成しているアプリがあります。それらを同じエンティティ グループに入れたくありません。短期間に大量のエンティティを作成する可能性があるためです。たとえば、24 時間で 100 万個になります。
特定の時点で、次のようなクエリでこれらすべてのエンティティを取得したいと考えています。
このクエリですべての Foo エンティティを取得する可能性が高くなるようにするには、最後の Foo エンティティが作成されてからどれくらい待つ必要がありますか?
編集:
この質問から、すべてのエンティティをすぐに取得できないようです。どれくらい待てばいいのか教えていただけると助かります。
distributed-computing - 分散データベースからの読み取りの一貫性
ネットワーク内の複数の場所に分散された一連のデータベースがあります。そのデータベースにデータを保存する必要がある 1 つのクライアント。
データが常に保存されるようにする必要があります。
障害点となる 1 つのマスターに接続することになるため、同期/非同期レプリケーションを使用してレプリカ セットを整理することはできません。そのため、クライアントから既知のすべてのデータベースにデータを送信します。どうやら、1 つのデータベースが保存に失敗する可能性があるため、他のデータベースの書き込みに依存しています。これらのセットは重複していますが、最終的にDBに格納された異なるデータセットを取得します。(例 DB1 -> [1, 2, 3]、DB2 -> [1, 3]、DB3 -> [2,3,4])
これらの DB から読み取るときに一貫したデータを取得するにはどうすればよいですか? データセットを正常にマージできるようにするには、データを書き込むクライアントと読み取るクライアントにどのような手法を適用する必要がありますか?
nosql - 結果整合性が整合するまでにかかる時間を計算するにはどうすればよいですか?
私たちのウェブサイトで提供する予定の HTML5 アプリのアセットを保存するために、nosql およびドキュメント指向のデータベースを調査し始めています。これは、ファイルシステムにファイルを保存するだけの代わりになることを目的としています。それらは、html、js、css、xml などのテキスト ファイルや、画像、サウンド、フォントなどのバイナリ ファイルなど、Web 用に最適化された小さなファイルになります。
私は耐障害性に興味があるので、私が検討しているソリューション (riak、Cassandra) は結果整合性を使用しています。私は概念を抽象的なレベルで理解していますが、マネージャーや意思決定者と話しているとき、結果整合性が一貫性を保つのにどれくらいの時間がかかるかを実際の言葉で説明することはできません. ミリ秒?秒?分?私はこの分野での経験がないので、これが何を意味するかについて、現実世界での経験を探しています。
さまざまな変数によって構成にかかる正確な時間が決まることは理解していますが、要件をサポートするために構築する必要があるインフラストラクチャの種類を理解し始める必要があります。したがって、私が探しているのは、特定の要件をサポートするためにネットワーク遅延、ノード数などを最適化する必要があるかどうかです。
テストするプラットフォームを選択する段階に到達したいと考えており、特定のソリューションに時間を費やす前に、「いいえ、これはうまくいきません」と言えるようにしたいと考えています.
現在、厳密な整合性を使用するシステム (Web サーバーのファイルシステムや mysql データベースなど) があるため、管理は負荷やタイムアウトなどの概念や「ダウン」状態に慣れています。しかし、私は彼らに「はい、データは現在利用できませんが、ダウンしていません。いずれ利用可能になるでしょう」と伝えることができません。彼らは「「最終的に」とはどのくらいの期間か」を知りたがっています。
最終的に一貫性のあるシステムが実際に Web サイトで機能するかどうかは、どうすればわかりますか?
database - Cassandra の書き込み失敗を処理するための一般的な方法は何ですか?
ドキュメント [1] では、次のように述べられていました。
したがって、2 つのレプリカのみが更新を受信すると仮定すると、書き込みは失敗します。ただし、最終的な一貫性により、すべてのノードが最終的に更新を受け取ります。
それで、再試行する必要がありますか?それともそのまま放置?
何か戦略はありますか?
cqrs - CQRS の結果整合性イベントの依存関係
私は CQRS と結果整合性モデルを初めて使用するので、これがばかげた質問である場合はご容赦ください。
始めたばかりなので、ローカル メモリ内に CommandBus と EventPublisher があります。私のイベントは再生目的で RavenDB データベースに永続化されますが、イベントは発行され、ハンドラーはローカルで呼び出されます (NServiceBus などを介して外部でキューに入れられることはありません)。EventPublisher はイベントを非同期に発行します (Task.Factory.StartNew のように)。
イベントに依存関係がある場合があります (たとえば、OrderShipmentStatusUpdated イベントを ReadModel に正しく処理する前に、OrderReceived イベントを ReadModel に処理する必要があります)。
この種のシナリオをどのように処理できますか? サガを使う?上記のような単純なメモリ内モデルで Sagas を使用するにはどうすればよいでしょうか。イベントを「延期」することは受け入れられると考えられますか (おそらく、それを延期としてマークし、延期されたすべてのイベントを「たまに」再処理しようとします)。
これに対処するためのいくつかの戦略は何ですか?
ありがとうございました。