昨今のアプリケーションでは、ユーザーの活動とデータの流れが絶え間なく発生しています。例えば、ソーシャルメディアでは、「いいね」などのユーザーリアクションが瞬時に送信され、ウェアラブルデバイスや IoT センサーなどは環境から得たデータを絶え間なく転送しています。また、e コマースサイトではショッピングカート操作や商品検索が行われるなどの行動によってさまざまなデータが生じていきます。こうしたデータは、リアルタイムで運営に影響を与えることもあります。今日、全てのソフトウェアを扱う企業において、このようなリアルタイムデータの豊富な流れを処理し、対応する能力が求められているのです。
こうした状況に対処するための手段として、アプリケーションに「イベント駆動型アーキテクチャ(以下、EDA)」が採用されています。
従来のモノリシックなアプリケーションは、拡張性の制約や開発の遅延、メンテナンスの複雑化につながりやすいものです。アプリケーションの各部分が独立して動作し、内部構造や定義を知らずして連携できる、疎結合なマイクロサービスとコンポーネントを活用することで、システムが柔軟かつ拡張・管理しやすくなるため、今やこうしたアーキテクチャの採用が主流となっています。
ここで EDA が果たす役割はとても重要です。EDA は、独立したサービス間の効率的なコミュニケーションを可能にし、リアルタイムのデータ処理とシームレスな統合を実現します。EDA により、企業は拡張性と柔軟性を兼ね備えたアプリケーションを構築できるのです。この EDA 実現のための技術スタックの中心にあるのが「Apache Kafka」です。
(※) モノリシックなアプリケーション = すべてのコンポーネントが一体となった大規模なソフトウェアのこと
本記事では、EDA アプリケーションにおける Kafka の利点について探り、その後、Apache Kafka on Heroku を活用して、グローバル規模での EDA アプリケーションの信頼性と拡張性を実現するための設定方法について解説と、導入を進める際のいくつかのヒントについて紹介します。
イベント駆動型システムにおける Kafka の利点とは
EDAは、リアルタイムデータを処理することで、アプリケーションが即座に変化やイベントに対応できるよう設計されています。EDA アプリケーションを基本的な概念に分解すると、以下の要素に整理できます。
- イベント:システムで発生した出来事を表すデータ(シンプルなメッセージや構造化オブジェクトの形式で表現される)。例:顧客の注文、倉庫の在庫確認、医療機器のアラートなど。
- トピック:イベントが公開されるチャネル。例:注文、確認、バイタルサインなど。
- プロデューサ:トピックにイベントを公開するコンポーネント。例:Web サーバー、POS システム、ウェアラブルデバイスなど。
- コンシューマ:トピックを購読し、イベント通知を受け取ってその後のプロセスを開始するコンポーネント。例:メール通知システム、ダッシュボード、配送倉庫など
コンポーネントの分離
EDA ベースのアプリケーションは、システム内の主な役割(プロデューサとコンシューマ)に基づいて構成されています。分離により、各コンポーネントは自分の役割に集中し、他の役割を気にせずに動作できます。
例えば、ある e コマースサイトの注文処理APIは、顧客の注文を受け取るとその注文データをイベントとして公開するだけで、注文の処理方法や顧客への通知について知る必要がありません。一方、配送倉庫は新規注文に関連するイベントを受信するだけで、イベントの発行元に関わらず、到着したイベントに基づき注文を出荷します。
Kafka は EDA アプリケーションの中心にデータストアとして機能し、プロデューサがイベントを公開し、コンシューマがそれを読み取れる環境を提供します。これにより更新や保守がシンプルになり、コンポーネントの垂直・水平スケールも容易になります。Kafka を中心としたこの構造により、リアルタイムデータ処理が効率的に行われます。
リアルタイムデータ処理
Kafkaは大量のデータストリームをリアルタイムで処理および配信することが可能です。情報の即時性が重要なアプリケーションにとって、これは欠かせない能力です。最新データに基づき迅速な意思決定が可能となり、企業の運営効率や顧客体験を向上させます。
フォールトトレランス
EDAアプリケーションが正しく動作するためには、イベントの受信・通知を行う中央ブローカーが確実で信頼性の高いものになる必要があります。Kafkaはフォールトトレランスを備えており、複数のノードにデータを複製し、同期したクラスタとして運用されます。ノードが故障してもデータは失われず、システムが継続して動作できるのです。
Apache Kafka on Heroku とは
Apache Kafka on Heroku は、管理と保守が容易であることが評価され、スタートアップからグローバル企業まで幅広く利用されているフルマネージド Kafka サービスです。このサービスにより、開発者はインフラ管理に時間を費やすことなく、アプリケーションの機能開発に集中できます。
Heroku では、マルチテナントの基本プランから、高キャパシティの専用プライベートプランまで、Heroku Shield との統合を含む多様なプランを提供しており、コンプライアンス要件を満たすことも可能です。
Apache Kafka on Heroku により、需要に応じたアプリケーションの拡張が可能です。Heroku がクラスター内のブローカー数を自動調整することで、データ量の増加に伴う容量を確保し、季節的な需要の増減や継続的な成長にも対応できる柔軟性を提供します。
信頼性も優れており、スタンダードプラン以上では最低3つの Kafka ブローカーによる冗長性が確保され、多くの場合8ブローカーまで拡張可能です。ノード間でデータが複製されるため、ノード故障時でもデータは保持され、アプリケーションの動作が維持されます。
統合のベストプラクティス
Kafka を用いた EDA アプリケーションの設計では、スムーズな運用を確保するための統合が重要です。以下のポイントに留意して設計を進めることで、Kafka の統合が容易になります。
- データフローを定義する:設計を開始する際、プロデューサーとコンシューマー間でデータがどのように移動するべきかを明確にマッピングしてください。あるイベントのコンシューマーが別のイベントのプロデューサーとしても機能できることに留意しましょう。プロデューサーは複数のトピックに公開でき、コンシューマーも複数のトピックを購読できます。データフローを明確に設計することで、Kafkaの統合がシームレスでボトルネックのないものになります。
- データの整合性と一貫性を確保する:Kafka のトランザクション、トピックとデータスキーマ管理、メッセージ配信保証などの機能を活用してください。Kafka の機能を最大限に活用することで、エラーのリスクを減らし、メッセージがシステム全体で一貫して確実に配信されることを保証します。
- パフォーマンスとアクティビティの監視:監視ツールを使って主要なパフォーマンス指標を追跡し、Kafka の運用にログ機能を活用します。堅実なログ管理とアプリケーションの継続的な監視により、重要なパフォーマンスの洞察が得られ、システムの健全性に関する問題が発生した際にアラートを受け取ることができます。
結論: Heroku で実現する EDA
この記事では、Apache Kafka が EDA の基盤としていかに重要かについてを検討しました。Kafka によりコンポーネントが分離され、フォールトトレランスが確保されることで、EDA ベースのアプリケーションの信頼性を高めつつ、拡張についても簡単に実現できるようになります。Heroku のマネージド Apache Kafka サービスを活用すれば、企業は IT 基盤の負担を信頼できるプロバイダーに委ねることが可能になり、開発者もイノベーションや実装に専念することが可能になります。
Apache Kafka on Heroku についてさらに知りたい方は、デモ (英語) をご覧ください。導入をお考えの方は、新しいアカウントを作成してください。
補足 : 本記事は米国のこちらの記事の翻訳になります。