メッセージングおよびイベントシステム
メッセージングとイベント駆動アーキテクチャが、疎結合でスケーラブルなバックエンド通信をどのように実現するかを学びましょう。
メッセージングシステムが存在する理由
メッセージングシステムは、サービス同士が直接呼び出しを行う代わりに、ブローカーを介して非同期に通信できるようにすることで、結合度を下げます。
- サービス間の直接呼び出しは、システム同士の依存関係を強くします。
- メッセージングは、プロデューサーとコンシューマーを分離するブローカーを導入します。
- サービスは、お互いを待たずに非同期で通信できます。
詳細
従来のシステムでは、あるサービスがタスクを完了するために別のサービスを直接呼び出します。これにより結合が強くなり、どれか1つのサービスが遅い、利用できない、または過負荷になると、呼び出し元に直接影響します。
メッセージングシステムは、サービス間にメッセージブローカーを置くことでこれを解決します。あるサービスは別のサービスを直接呼び出す代わりに、ブローカーへメッセージを送信し、受信側のサービスがそれを独立して処理します。
これにより、非同期通信が可能になります。送信側は受信側の処理完了を待つ必要がないため、システムの応答性と耐障害性が向上します。
サービスを分離することで、メッセージングシステムは、システム全体を壊すことなく個々のコンポーネントをスケール、保守、進化させやすくします。
メッセージキュー
メッセージキューは、コンシューマーが処理できるようになるまでタスクを保存することで、非同期通信を可能にします。
- プロデューサーは、別のサービスを直接呼び出す代わりにメッセージをキューに送信します。
- キューは、コンシューマーがメッセージを処理するまでそれらを保持します。
- これにより、非同期処理が可能になり、システムの各コンポーネントが疎結合になります。
詳細
メッセージキューは、プロデューサーとコンシューマーの間のバッファとして機能します。即時処理を求めるのではなく、メッセージはコンシューマーが利用可能になるまでキューに保存されます。
これにより、システムはタスクを非同期に処理できます。たとえば、Webリクエストは、タスクの完了を待たずに、メール送信のようなタスクをすばやくキューに追加できます。
キューは信頼性も向上させます。コンシューマーが失敗したり、一時的に利用できなくなったりしても、メッセージはキューに残り、後で処理できます。
プロデューサーとコンシューマーを分離することで、メッセージキューはシステム間の依存関係を減らし、各コンポーネントを独立してスケールできるようにします。
公開 / 購読(Pub/Sub)
Pub/Sub は、1つのイベントを、それらの間に直接接続がなくても複数のコンシューマーに配信できるようにします。
- パブリッシャーは、特定のコンシューマーを指定するのではなく、トピックにメッセージを送信します。
- 複数のサブスクライバーが同じイベントを同時に受け取ります。
- このパターンは、イベントのブロードキャストと疎結合をサポートします。
詳細
公開/購読モデルでは、パブリッシャーは特定のコンシューマーに直接送るのではなく、トピックにメッセージを送信します。
コンシューマーはそのトピックを購読し、そこに公開されたメッセージを自動的に受け取ります。これにより、1つのイベントがシステム全体で複数の独立した処理を引き起こせます。
たとえば、ユーザーがサインアップしたとき、1つのイベントでメール、分析、請求、通知など複数のサービスに通知できます。パブリッシャーはそれらを知っている必要がありません。
このモデルはプロデューサーとコンシューマーを分離し、システムを拡張しやすくします。新しいサブスクライバーは、パブリッシャーを変更せずに追加・削除できるため、柔軟性とスケーラビリティが向上します。
Pub/Sub は、直接的な同期通信ではなくイベントに反応するイベント駆動アーキテクチャで広く使われています。
イベント駆動システム
イベント駆動システムでは、サービスがイベントを発行し、それに反応することで通信できるため、コンポーネント間の直接的な依存関係を減らせます。
- サービスは、他のサービスを直接呼び出す代わりに、イベント(例: "User Created")を発行します。
- 複数の独立したサービスが、調整なしに同じイベントに反応できます。
- これによりシステムの結合度が下がり、各サービスを独立してスケールおよび進化させられます。
詳細
イベント駆動システムでは、アクションは直接的なサービス呼び出しではなく、イベントによってトリガーされます。新しいユーザーがサインアップするなど、何かが起こると、システムはその変化を表すイベントを発行します。
このイベントはメッセージブローカーを通じて送信され、複数のサービスがそれを購読して反応できます。たとえば、1つの "User Created" イベントで、メールサービスがウェルカムメッセージを送信し、分析サービスがユーザー増加を追跡し、請求サービスがアカウントを初期化できます。
従来のリクエスト・レスポンス型システムとは異なり、イベントの発行元はどのサービスがそれを消費するかを知る必要がありません。これにより密結合がなくなり、他のサービスに影響を与えることなく、サービスの追加、削除、変更が可能になります。
このアーキテクチャは、各サービスが自分のペースでイベントを処理できるため、スケーラビリティを向上させます。また、1つのサービスが失敗しても他のサービスはブロックされずに動作を続けられるため、耐障害性も向上します。
ただし、イベント駆動システムでは、イベントの順序、重複、サービス間の最終的整合性の扱いなど、複雑さも増します。
イベントソーシング
イベントソーシングは、すべての変更をイベントとして保存し、任意の時点でシステムの状態を再構築できるようにします。
- 現在の状態だけを保存する代わりに、システムはイベントの系列を保存します。
- 現在の状態は、イベントを順番に再生することで導出されます。
- これにより、監査可能性、履歴追跡、再現可能なシステム状態が実現します。
詳細
従来のシステムでは、データベースはデータの最新状態だけを保存します。イベントソーシングでは、すべての変更を追記専用のログにイベントとして保存する、異なるアプローチを取ります。
たとえば、現在のユーザープロファイルだけを保存する代わりに、システムは "UserCreated"、"EmailUpdated"、"PasswordChanged" のようなイベントを記録します。これらのイベントは、変更の完全な履歴を表します。
現在の状態は、これらのイベントを順番に再生することで再構築されます。これにより、システムは任意の時点の状態を再作成でき、デバッグ、監査、分析に役立ちます。
このアプローチは高い追跡可能性を提供し、システムがどのように現在の状態に至ったのかを正確に理解できるようにしますが、その一方で、保存と処理に追加の複雑さももたらします。
メッセージブローカー
メッセージブローカーは、サービス間でメッセージがどのように保存され、ルーティングされ、配信されるかを管理する仲介役として機能します。
- メッセージブローカーはプロデューサーからメッセージを受け取り、コンシューマーに配信します。
- 信頼性の高い配信やメッセージの永続化などの保証を提供します。
- メッセージが正しいコンシューマーに届くように、ルーティングロジックを処理します。
詳細
メッセージブローカーはプロデューサーとコンシューマーの間に位置し、メッセージの流れを管理する中心的なシステムとして機能します。
プロデューサーがメッセージを送信すると、ブローカーがそれを保存し、適切なコンシューマーに確実に配信します。これにより、サービス同士が直接通信する必要がなくなります。
メッセージブローカーは配信保証も提供します。システムによっては、データ損失を防ぐためにメッセージをディスクに永続化したり、配信に失敗した場合に再試行したりできます。
また、どのコンシューマーがどのメッセージを受け取るべきかを判断するルーティングも処理します。これには、シンプルなキューベースの配信や、pub/sub トピックのようなより複雑なパターンが含まれます。
これらの責務を中央集約することで、メッセージブローカーは通信を簡素化し、分散システムをより信頼性が高く、スケーラブルにします。
一般的なメッセージング技術
異なるメッセージングシステムは、それぞれ異なるパフォーマンス、信頼性、アーキテクチャ上の要件に合わせて設計されています。
- Kafka は、高スループットのイベントストリーミングと永続ログ向けに構築されています。
- RabbitMQ は、信頼性の高いメッセージ配信と柔軟なルーティングに重点を置いています。
- NATS は、マイクロサービスにおける低レイテンシ通信向けに最適化されています。
詳細
Kafka は、大量のデータを処理するために設計された分散イベントストリーミングプラットフォームです。メッセージを永続ログに保存し、コンシューマーがイベントを再生できるため、分析パイプラインやイベント駆動システムに適しています。
RabbitMQ は、キューと複雑なルーティングパターンをサポートする従来型のメッセージブローカーです。信頼性の高い配信に重点を置いており、バックグラウンドジョブ処理やタスクキューで一般的に使用されます。
NATS は、シンプルさと速度のために設計された軽量なメッセージングシステムです。非常に低いレイテンシの通信を提供し、高速なメッセージ配信が重要なマイクロサービスアーキテクチャでよく使用されます。
各システムには異なるトレードオフがあります。Kafka はスループットと耐久性を優先し、RabbitMQ は柔軟性と信頼性を重視し、NATS は速度とシンプルさに焦点を当てています。適切なツールの選択は、システムの要件によって決まります。
分散システムにおけるメッセージング
メッセージングシステムは、分散サービス間の通信を調整しながら、それらを独立かつスケーラブルに保ちます。
- サービスは直接接続ではなく、ブローカーを通じて通信します。
- メッセージングは、メッセージをバッファリングして再試行することで、耐障害性を向上させます。
- これにより、多数の独立したサービス間でスケーラブルな通信が可能になります。
詳細
分散システムでは、複数のサービスが独立して、しばしば異なるマシン上で動作します。それらの間の通信を調整することは、大きな課題になります。
メッセージングシステムは、メッセージブローカーを中央の通信レイヤーとして導入することで、これを解決します。サービスは互いに直接呼び出すのではなく、ブローカーを通じてイベントを送受信します。
この疎結合化により、耐障害性が向上します。あるサービスが一時的に利用できない場合でも、メッセージはシステム内に保持され、他のサービスをブロックすることなく後で処理できます。
また、スケーラビリティも向上します。既存のサービスを変更せずに、新しいサービスを追加してイベントを消費できるため、強い依存関係を持たずにシステムを拡張できます。
その結果、メッセージングシステムは現代の分散アーキテクチャにおける基盤的なコンポーネントとなり、柔軟で、回復力があり、スケーラブルなシステム設計を可能にします。
質問セクション
1 / 5
このレッスンはプレミアムコンテンツです
プレミアムにアップグレードしてぼかしを解除し、全文を読めるようにしましょう。