Serverless のデータストアにおけるデータの一貫性の課題を理解する

Serverless は、Amazon DynamoDB、Azure Cosmos DB、および Google Cloud Firestore などのデータストアで自動スケール、ペイパー使用価格設定、および運用上のオーバーヘッドの低減を実現します。ただし、分散された性質は、データの一貫性の根本的な取引オフを導入しています。アプリケーションがそれを書いている直後にデータを読み込み、ユーザーは最新の値を見ることを期待しています。グローバルに分散したシステムでは、その保証が非トリバイアルになります。 [FLT:[FLT:]:[FLT:] は、正規販売店を通知することを可能にします。

データ一貫性は、一種のフィット特性ではありません。異なるワークロードには異なる保証が必要です。例えば、eコマース在庫システムは、在庫更新のための強力な一貫性を必要とするアイテムをオーバーセーリングしてはならない。一方、ソーシャルメディアフィードは、新しい投稿伝搬中に数秒のラグを許容することができます。適切な一貫性モデルを選択して、補完的なパターンを実行することで、サーバーレスアプリケーションが予測可能に動作し、プラットフォームの弾力性から利益を得ることができることを確認します。

Serverless ストアの一貫性モデル

強い一貫性

読み込まれた全てのものが最新の書き込みを返すことを強く保証します。 サーバレスシステムでは、これは、プライマリレプリカから読み込むか、クォーラムベースのプロトコルを使用することで実現します。 DynamoDB サポートのようなサービスは、一貫性のある読み取り[]を厳密に確認します(追加費用とレイテンシ時)、Azure Cosmos DBは、マルチマスターレプリケーションを使用して、グローバルに分散されたアカウントの一貫性を提供します。 金融取引、ユーザー認証、または絶対的な予約システムが要求される際の一貫性を使用する。

時事の一貫性

最終的な一貫性は、ほとんどのサーバーレスデータストアのデフォルトです。新しい書き込みがデータ項目に作られていない場合、最終的に(通常、ミリ秒または秒以内)すべてのレプリカは、同じ値に収束することを意味します。このモデルは、最高の可用性と最低レイテンシを提供します。読み取り重いワークロード、製品カタログ、および階段読み取りが短いウィンドウに許容されるロギングシステムに最適です。

因果関係

因果一貫性は、原因として関連した操作の順序を保持します。操作A(更新プロファイル画像)が動作する前に起こる場合、B(コメントを参照)、Bの前に任意のオブザーバーがAが表示されます。このモデルは、強力で、時折一貫性と]]のようなサービスによってサポートされています。 Google Cloud Datastore]。 これは、イベントの注文が重要である共同編集、ソーシャルフィード、およびチャットアプリケーションに役立ちます。

一貫性を維持するためのベストプラクティス

1. 各操作に適した一貫性モデルを選択します。

アプリケーション全体に単一の一貫性レベルを選んだよりも、各クリティカルな読み取りまたは書き込み操作を独自の一貫性要件で設計します。 DynamoDB では、個々の []または ]の呼び出しに対して、]の呼び出しを ] に指定できます。 このハイブリッドは、パフォーマンスと補正のバランスを促進します。 決定書を文書化し、許容限度内にレイテンシーが保持されるように負荷の下でテストします。

2. 佐賀・二相コミットで配布された取引を使用する

複数のデータストアやサービスに及ぶ場合、atomicity を維持するためのメカニズムが必要です。 [[] 分散トランザクション など - 対相コミット(2PC)プロトコル - 参加するすべての側面がコミットまたは強制的に処理されることを保証します。 ただし、2PC は遅くなり、可用性を低下させることができます。 代替手段は ]] です。各操作が、アクションが実行されると、$25を超える場合、各操作は、複数のトランザクションが実行される場合、$ [FLT:] が実行される場合、多くのトランザクションが実行されます。

3. 紛争解決戦略を実施

同時並列では、複数の領域展開で同じデータ項目に書き込み、競合を作成できます。 Serverless ストアは通常、] のLast-writer-wins (LW)] を使用します。これにより、最新のタイムスタンプが保持されます。 シンプルながら、LWW は、クロックが同期外の場合、データを失うことができます。 より豊かなセマティクスでは、 のバージョン を使用して、 :3] または [FLT4] を組み合わせて、 複雑なデータが実行されます。 [FLT] または [FLT] または [F] 複雑なバージョンが、 複雑なバージョンを最適化] または [Recontrftab を最適化] するには、 または [Recont が、 が、 が実行されます。 [F] または [Conft または [F] または [Cont 複雑なバージョンが、 を制限する 複雑なバージョンを制限する または [Cont を制限する (Recording が、 設定された または [[F] 設定された 設定

4. 免責業務および取引のレバレッジ

ネットワークの失敗や過渡エラーは、クライアントのリトリートを引き起こす可能性があり、重複処理が生じる可能性があります。 ] である操作を設計する 意図しない]] は、そのリスクを排除します。 たとえば、各書き込みリクエストに固有の不利なキーを割り当てます。 サーバは、同じキーを共有するリクエストを複製することができます。 多くのサーバーレス SDK は、ネイティブに書き出された書き込みをサポートしています。 コンテンツの保存と保存を強制的に組み合わせて、コンテンツの一貫性を保留しないようにします。

5. 変更のストリームおよび監査とデータの整合性を監視します

サーバレス環境では、DynamoDB Streams、Cosmos DB Change Feed、Firestoreのリアルタイムリスナーなど、全ての変更を監視することができます。各変更後にデータが不変状態に保たれることを検証するために、ラムダまたはクラウド機能を設定してください。例えば、銀行アプリケーションはアカウントの取引を購読し、残高が常にクレジットの合計を平等に検証することができます。定期的な監査は、ワークフローを解除し、ワークフローをトリガーします。

6. お使いのユースケースのためのデータレプリケーションの最適化

グローバルレプリケーションは、世界中のユーザーにとってレイテンシーを高めますが、矛盾するウィンドウを増加させます。適切な一貫性レベルにレプリケーションを設定し、アクティブアクティブと対。 ]]アクティブパッシブ[]]トポロジーを使用して検討します。 アクティブアクティブアクティブ(マルチマスター)は、書き込みレイテンシが低いが、強力なコンフリクト解像度が必要です。 アクティブパッシブ(プライマリレイト)は、一貫性のあるレベルのレプリケーションをクリアするのオプションを準備するので、必要に応じて、より強力なオプションを準備できます。

一貫性を維持するための建築パターン

コマンド クエリの責任の分離 (CQRS)

CQRSは、それぞれが独自に最適化できるように、読み取りモデルから書き込みモデルを分離します。書き込みは、強く一貫したストアに移動します。読み取り値は、最終的に一貫した予測から来ます。このパターンは、]event sourcing[]]のアプローチと組み合わせると、特に強力です。すべての状態が不変なイベントとして保存されると、読み取りモデルは、一貫性の問題が生じる場合にイベントログから再構築することができます。マーティン・フレール[FLT:[FLT:][FLT:][FLT:[FLT:]]]を参照してください。[FLT:[FLT:[FLT:]を参照してください]を参照してください]を参照してください。[FLT:[FLT:[FLT:[FLT:[FLT:[FLT:]の[FLT:]]]を参照してください]を参照してください]を参照してください]を参照してください:[F]を参照してください:[FLT:[FLT:[F]を参照してください:[F]の[F]の[F]を参照してください:[[[[F]を参照してください]を参照してください:[F]を参照してください:[F]の[F]の[FLT:

イベントの調達とイベントの一貫性

イベントの調達は、現在の状態の代わりにイベントのシーケンスを保存します。イベントは、アベンドオンオンオンオンオンオンオンオンオンオンオンオンオンオンオンオンオンオンオンオンオンオンオンとインミュータブルであるため、自然に一貫しています。DynamoDBやCoss DBなどのサービスはイベントストアとして機能することができます。消費者はイベントを非同期的に処理し、最終的にはモデルを読み取ります。競合のまれなケースでは、イベントストリームを既知のチェックポイントから再生することができます。このパターンは、 耐久性と監査可能性を一貫性にするために、一貫性を保た:

信頼できるメッセージングのためのOutboxパターン

サーバレス関数がデータベースに書き込まれ、それから、メッセージをキューに送信すると、2つの操作はアトミックではないかもしれません。 []outboxパターンは、同じトランザクション内の同じデータベースにメッセージを保存することによってこれを解決します。 別のプロセス(ストリームプロセッサなど)は、outboxを読み、メッセージを公開します。 このことは、データベースが書き込みとメッセージ送信が、両方がコミットされているか、ロールバックされたか、SLTFARCサービス全体に一貫性を記述するかどうかを保証します。 [FATF]

特別なケースの処理:ジオ‐ディストリビューションとオフライン書き込み

モバイルおよびIoTアプリケーションは、オフラインで動作し、後で同期することが多いです。 ServerlessベンダーSDKは、カスタムの競合解決ツールを介して競合を処理する同期でオフラインの持続性を提供します。 たとえば、AWS AppSync with DynamoDBは、タイムスタンプまたはクライアント定義されたロジックに基づいてバージョンをマージすることができます。 このようなライブラリを使用する場合、常に、リアルタイムのネットワーク条件下で競合解決ロジックをテストし、競合の数を監視します。

複数行の一貫性については、Cosmos DBがグループ関連項目をグループ化してサポートするコンセプトである「]]の一貫性グループ]を使用します。これにより、ユーザのプロファイル画像が地域Aで更新されるシナリオが、そのバイオアップデート(同じグループ)はまだ地域Bに到達していないことを防止します。

試験と検証戦略

一貫性のあるバグは、分散した負荷のみで表されます。 実際のサーバーレスエミュレータやクラウドインスタンスに対して実行する統合テストを書き、同時並列書き込みと読み込みをシミュレートします。 のようなツールは、Jepsen]は、データストアがネットワークのパーティションの下で正しく動作することを確認することができます。 生産のために、カナリアデプロイを実行し、一貫性メトリックを監視しながら、新しいコードパスにトラフィックを徐々にシフトします。 階段のSLAを定義(データの相続化)、およびそれらのデータを読み取り、およびそれらのデータを変換するかどうかを検証します。

インフォメーション

サーバレスデータストアのデータ一貫性は、アーキテクチャの選択肢を審議する必要があります。利用可能な一貫性モデルを理解し、分散トランザクションまたはサガパターンを採用し、不正な操作を設計し、競合解決メカニズムを活用することで、スケーラブルで信頼性のあるアプリケーションを構築することができます。システムの一貫性を監視し、変更ストリームと監査を通じて保証し、CQRS、イベントの調達、およびサービス境界全体にわたる整合性を維持するためのアウトボックスパターンを採用します。これらのベストプラクティスでは、サーバーの一貫性が維持され、トラフィックを削減し、トラフィックを削減し、グローバル規模を把握することができます。