効果的な集計デザイン に関するVaughn Vernonの一連の記事を読んでいます。
トランザクションの整合性と結果の整合性のどちらを決定するかについては、次のように述べられています。
これについてエリック・エバンスと議論すると、非常にシンプルで健全なガイドラインが明らかになりました。ユースケース(またはストーリー)を調べるときは、データの一貫性を保つことがユースケースを実行するユーザーの仕事かどうかを尋ねます。そうである場合は、トランザクションの一貫性を保つようにしてください。それが別のユーザーのジョブまたはシステムのジョブである場合は、最終的に整合性があるようにします。そのちょっとした知恵は、便利なタイブレーカーを提供するだけでなく、私たちの領域をより深く理解するのに役立ちます。実際のシステムの不変量、つまりトランザクションの一貫性を保つ必要があるものを公開します。その理解は、技術的な学習にデフォルトすることよりもはるかに価値があります。
このアドバイスは私を混乱させます。私がキャリアで書いたソフトウェアの大部分は、データの一貫性を維持する責任から解放されたため、エンドユーザーにとって有用でした。この結果として、ユーザーは常に一貫した状態を遅延なく観察することを期待しています。一貫性を実現するソフトウェアに料金を支払う顧客にとって、観察される一貫性のない状態はすべてバグです。
私の経験では、リクエストを送信するとき、ユーザーは通常、少し遅れて一貫性のある状態を観察するよりも、一貫性を保つために後で変更される即時の回答を使用するのではなく、.
逆に、一貫性を達成するのがユーザーの責任である場合、システムは彼に矛盾について警告しますが、ユーザーを要求する代わりに、いくつかの小さなコマンドを実行することで、最終的に一貫性を達成することができます1つの巨大なコマンドでこれを行うには。
EvansとVernonが一貫性を正しく得ることがシステムの仕事である場合に最終的な一貫性を推奨し、ユーザーの責任である場合にトランザクションの一貫性を推奨するのはなぜですか?
上記のルールに従ってトランザクションまたは結果の整合性が適切であると見なされる制約の例とユースケースを指摘できますか?
否定できないマイクロサービスには基本的な原則があります。 マイクロサービスは独立したエンティティです;マイクロサービスに基づくシステムを構築している場合、定義により、それらを中央のデータ機関に依存させることはできません(リレーショナルデータベース)。マイクロサービスが独立していないためです。各マイクロサービスに独自の独立したデータストアを提供するということは、最終的な整合性のために解決する必要があることを意味します。
もちろん、そのようにする必要はありません。確かに、すべての「マイクロサービス」を中央のデータストアに結び付け、どこでもトランザクションの一貫性を確保できます。アクターモデルはこれを常に行います。純粋主義者がそれをマイクロサービスアーキテクチャと呼ぶことを私は知りません。
Vernon Vaugnのポイントは、ユーザーは通常、一貫性を達成する責任がないということです。システムです。一貫性は機能以外の要件です。 「ユーザーとして、[何らかのアクションを実行して] [ある目標を達成できるようにしたい]という形にはなりません。
とは言っても、ユーザーは一部のやり取り(ある当座預金口座から別の当座預金口座への送金など)がトランザクション的に一貫していて、最終的には一貫していないことを期待しています。銀行の顧客が「私のお金はどこに行ったのか」と尋ねるのではなく、後でターゲットアカウントに表示されるようにするだけです。
このアドバイスは私を混乱させます。
あなたのせいではありません。
私容疑者は、ウディダハンのアイデアに似たアイデアを CQRSを回避する場合 ;協調的ユースケースと非協調的ユースケースの違い。
小切手 レジスタを考えます。アカウントに対して引き落とされる各交渉可能な証券を記述するエントリの台帳。通常、各エントリには、小切手に対する一意の識別子(通常、使用される口座は暗黙的です。各レジスターは単一の口座に関連付けられています)、メモフィールド、金額、および残高が含まれます。
その実行中の残高は、チェック自体の詳細、およびレジスター(状態)の前の残高エントリから導出されます。通常、他のエントリからの意外なエントリや、複数のチェックを同時に記録しようとすることによる輻輳はありません。したがって、現在の残高がエントリの累計と一致する必要があることを不変条件として主張するのが妥当です。
一方、レジスターの残高をアカウントの残高と一致させるのはより複雑です。アカウントの残高は、小切手の入金、送金、口座への入金など、他の協力者に依存します。したがって、レジスターの現在の合計とアカウントの合計を一致させようとする作業は、後でまで延期することができます(延期する必要があります)。