イベントソーシング、それは開発者がビッグデータ移行プロジェクトがなければ、開発者はアプリケーションの存続期間で動作するように持っている1つの事前にモデル化データベースで立ち往生しているのRIDなるのでCQRSは素晴らしいです。 CQRSとESには、イベントストア、監査ログなどのスケーリングのような、インターネット上に既に存在する他の利点もあります。Event sourcingとCQRSを使用する際の短所は何ですか?
しかし、どのような欠点がありますか?ここで
が、私は複雑な
- 小さなデモアプリケーションを調査し、書き込み後に考えることができますいくつかの欠点です:一部の人々は、ESが複雑であると言います。しかし、私は複雑なアプリケーションを持つことは、クエリ言語(複数の結合、インデックスなど)を使用して非常に制限付きのクエリを実行できる複雑なデータベースモデルよりも優れていると言います。 Scalaのようなプログラミング言語の中には、非常に豊富なコレクションライブラリがあり、非常に複雑な集約を作成するのに非常に柔軟性があります。また、Apache Sparkがあります。しかし、データベースは常にクエリ言語の機能に制限され、データベースの配布は難しくなり、分散アプリケーションコード(別のマシンに別のインスタンスをデプロイするだけです)。
- ディスクの空き容量が多い:イベントストアは、イベントを格納するために大量のディスクスペースを使用する可能性があります。しかし、数週間おきにクリーンアップをスケジュールし、スナップショットを作成することができます。将来、古いイベントが必要になったときに、履歴イベントをローカルHDに保存できますか?
- ハイメモリ使用量:すべてのドメインオブジェクトの状態は、RAMの使用量が増加する可能性がありますメモリに格納され、RAMは、私たちすべてがどのように高価です。 大きな問題!私は貧しいですから!これに対する解決策はありますか?メモリに状態を格納する代わりにSqliteを使用することができますか?アプリケーションに複数のSqliteインスタンスを導入することで、より複雑なものになっていますか?
- 起動時間が長くなる:イベントが発生すると、障害発生またはソフトウェアアップグレードの起動が遅くなります。しかし、我々はこれを解決するためにスナップショットを使うことができますか?いくつかのアプリケーションのための問題:
- 結果整合。 FacebookがCQRSでイベントを保管してポストを保管し、忙しいフェイスブックのシステムがどのようなものかを考えると、想像してみてください:)
- イベントストアのシリアルイベントとにかく落ち込んでいるイベントストア内のイベントの内容を照会することはできません。また、今後イベントに別の属性を追加することはできません。解決策は、シリアライズされたイベントの代わりにイベントをJSONオブジェクトとして保存することでしょうか?しかしそれは良いアイデアですか?または、orignalイベントオブジェクトの変更をサポートするイベントを追加しますか?
私がここで育った不利益についてコメントしてください、私が間違っていて、他の人が私が逃したかもしれないと示唆してもらえますか?
すべてのドメインオブジェクトの状態がメモリに格納されているのはなぜですか?ドメインオブジェクトは、必要に応じてイベントから再作成されます。彼らはFBがイベントソーシングを使用しないと思っていますが、なぜなら彼らは忙しいからです。私が理解しているのは、1人の書き込みマスターと複数の読み取りスレーブを使用して「最終的に」同期するため、最終的な一貫性を使用するため、時には何かを投稿してフィードで見ることができないことがあります。 –
意味があります!しかし、ドメインオブジェクトの状態は、再作成するのに高価であるため、メモリに格納されると考えられた理由はあります。そのドメインオブジェクトの1つの属性への更新があるたびに、ドメインオブジェクトごとに何千ものイベントを実際に押し込んでいますか?イベントソーシングを使用しないFBについては間違っていたと思います。ありがとうございます:) – hajime
通常、オブジェクトごとに何千ものイベントがありませんでしたが、そうした場合は思ったほど遅くないかもしれません(単純にイベントを取得するための結合なしで選択)し、メモリに適用されます。オブジェクトのイベントを「スナップショット」することは、perfテスト時に実際に問題があると判明した場合は、いつでも行うことができます。 –