web-dev-qa-db-ja.com

イベントソーシング:メッセージキューを使用する必要がある(使用しない)場合

JavaとCassandraを使用したイベントソーシングを使用してプロジェクトをゼロから構築しています。マイクロサービスに基づいているアプリで、場合によっては情報が非同期で処理されます。メッセージのどの部分か疑問に思いました。キュー(Rabbit、Active MQ Artemis、Kafkaなど)は、この環境でのテクノロジースタックを改善するために機能し、シナリオを理解していれば、それを使用しません。

9
Felipe

まず、RabbitMQのようなメッセージングインフラストラクチャを、Kafkaのようなイベントストリーミング/保存/処理から分離することから始めます。これらは、2つ(またはそれ以上)の異なる目的のために作られた2つの異なるものです。

イベントの調達に関しては、イベントを保管する場所が必要です。このストレージは追加専用であり、IDに基づく非構造化データの高速読み取りをサポートする必要があります。このような永続性の一例は EventStore です。

イベントソーシングはCQRSと連携します。つまり、変更(イベント)を別のストアに投影する必要があり、クエリを実行できます。これは、イベントをそのストアに投影することによって行われます。これは、ドメインオブジェクトの状態を変更するためにイベントが処理される場所です。予測にメッセージインフラストラクチャを使用することは一般的に悪い考えであることを理解することが重要です。これは、メッセージングの性質と2フェーズコミットの問題によるものです。

イベントがどのように永続化されるかを見ると、イベントが1つのトランザクションとしてストアに保存されていることがわかります。その後、イベントを公開する必要がある場合、これは別のトランザクションになります。 2つの異なるインフラストラクチャを使用しているため、問題が発生する可能性があります。

そのようなメッセージングの問題は、メッセージが通常「少なくとも1回」配信されることが保証されており、メッセージの順序が通常保証されていないことです。また、メッセージコンシューマーが失敗し、メッセージをNACKすると、メッセージは再配信されますが、通常は少し遅れて、再びシーケンスが中断されます。

順序付けと複製の懸念は、Kafkaのようなイベントストリーミングサーバーには適用されません。また、キャッチアップサブスクリプションを使用する場合、EventStoreはイベントの配信を1回だけ保証します。

私の経験では、メッセージはコマンドを送信し、イベント駆動型アーキテクチャを実装して独立したサービスを事後対応的に接続するために使用されます。一方、イベントストアはイベントを永続化するために使用され、そこに到達したイベントのみがクエリストアに投影され、メッセージバスにも公開されます。

15
Alexey Zimarev

Send(command)とpublish(event)の違いを明確にしてください。 Udi Dahanは、 バスとブローカー に関するエッセイでそのトピックに触れています。

イベントソーシングを行っているほとんどの場合、公開されたイベントから状態を再構築したくないnot。状態が必要な場合は、技術機関/記録簿に履歴を照会し、履歴から状態を再構築します。

一方、メッセージキューからのイベント駆動型アクティビティは問題ないはずです。単一のイベント(およびサブスクライバーの状態)に必要なものがすべて揃っている場合は、バスからの実行は問題ありません。

場合によっては、両方を行うこともあります。たとえば、キャッシュされたビューを更新する場合は、さまざまなBobChangedイベントをサブスクライブして、キャッシュされたデータがいつ古くなったかを確認します。古いビューを再構築するには、履歴の表現を再読み込みして、更新されたビューに変換します。

5
VoiceOfUnreason

イベントソーシングアプリケーションの世界では、メッセージキューを使用すると、通常、プロデューサーとコンシューマーの間でパブリッシュ/サブスクライブパターンスタイルの通信を実装できます。また、通常、配信保証(どのメッセージがどのサブスクライバーに配信され、どのメッセージが配信されなかったか)を支援します。

ただし、すべてのメッセージを無期限に保存するわけではありません。あらゆる種類のイベントソーシングを行うには、イベントストアが必要です。

問題は「キューに入れるかどうか」ではありませんが、次のようなものです。

  • これは大量のイベントを無期限に保存できますか?
  • パブリッシュ/サブスクライブ機能はありますか?
  • 少なくとも1回の配達保証を提供しますか?

したがって、 Kafka または EventStore のようなものを使用して、すべてをすぐに使用できるようにする必要があります。または、イベントストアとメッセージキューを手動で組み合わせることができますが、これはさらに複雑になります。

5
IlliakaillI