イベントドリブンアーキテクチャの概要
ソフトウェア開発の広大な領域では、イベントドリブンアーキテクチャ(EDA)の重要性が増しています。EDAの設計はビジネスの動きを速く反映させ、デジタル環境を動的かつ先進的な場へと変えるものです。EDAの基本的な考え方は、イベントを生成し、それを検出して管理し、処理するという4つの柱に集約されます。
イベントの重要性
EDAについて語る際には、よく「イベント」という用語が出てきます。これは何らかの状況変化を表す合図です。たとえば、ある顧客がECサイトで商品を購入する通常の行為が、複数の自動処理を引き起こします。たとえば在庫数の更新や購入者への通知、配送手配の開始などがそれにあたります。
イベントとは、現在の状態がどのように変化したかを示すデータの単位と考えられます。ユーザー操作、センサーからの通知、またはソフトウェアの動作など、さまざまなところからイベントは発生します。発生したイベントは、イベント制御を担うアプリやサービスによって検知され、変化に対応します。
イベントドリブンアーキテクチャを支える主な考え方
EDAでは、以下の2つの基本方針が中心です。
イベントドリブンアーキテクチャの利点
EDAを採用すると、以下のような利点があります。
イベントドリブンアーキテクチャの例
EDAはさまざまな業界で活用されています。たとえばIoTの分野では、デバイスから大量のイベントが継続的に発生し、それを同時に処理します。また、マイクロサービスの世界ではサービス同士がイベントで連携し、ストリーム処理の分野ではイベントが連続的に流れ続ける状況に対応します。
ここからは、強力なEDA関連技術であるApache KafkaとCloud Eventsに焦点を当てます。各々の動作の仕組みや特徴、違いなどを掘り下げつつ、イベントドリブンなシステムを頑丈に作るうえでそれらがどう役立つかを探ります。
イベントドリブンな仕組みに変革をもたらしたApache Kafkaの役割
イベント指向の基盤は、Apache Kafkaの登場によって大きく変わりました。もとはLinkedInが開発し、後にApache Software Foundationに引き取られてオープンソースとして進化した強力なソフトウェアです。Kafkaの特長は、大量の即時データ処理に対応できるほどの信頼性と高パフォーマンス性です。巨大なデータストリームを滞りなく扱う能力にすぐれ、リアルタイム分析、ログ収集、イベントトリガーなど多様な操作を支える基盤になっています。
Apache Kafkaの基本構成
Kafkaを語る際に注目すべきいくつかのコンポーネントがあります。これらがKafkaの効率や処理性能を支える鍵です。
Apache Kafkaがもたらす価値
データ中心の動きが主流になりつつある環境で、Apache Kafkaはその価値を見逃せません。即時データストリームを扱うシステムでは、Kafkaの高速データ処理機能が非常に重要になっています。具体的には以下の点がKafkaの魅力です。
要するに、Apache Kafkaは分散環境でも信頼性を保ちつつ膨大な量の即時データを扱うのに長けています。ほぼリアルタイムのデータ処理と耐久性や拡張性を兼ね備えており、大規模データを扱う組織にとって適した手段といえます。
Cloud Native Computing Foundation (CNCF)が提唱するCloudEventsは、クラウド上で起きるイベントを標準化された形式で扱うことで複雑なシステム同士の連携を容易にし、クラウド環境に対応するアプリを効率的に守る仕組みを提供します。
CloudEventsの本質
CloudEventsが提供する基本要素は、イベントに基づくシステムにおいて次のように活かせます。
CloudEventの構造
CloudEventはキーと値のマッピングによってつくられます。キーは属性名を示し、値はJSON
データなどを含む形式です。実際の例としては以下のようになります。
{
"specversion" : "1.0",
"type" : "com.github.pull.create",
"source" : "https://github.com/cloudevents/spec/pull",
"subject" : "123",
"id" : "A234-1234-1234",
"time" : "2018-04-05T17:31:00Z",
"comexampleextension1" : "value",
"comexampleothervalue" : 5,
"datacontenttype" : "application/json",
"data" : {
"much" : "wow"
}
}
ここではspecversion
やtype
、source
、subject
、id
、time
などが必須属性になります。data
にはイベントの中核情報が入り、datacontenttype
でその形式が示されます。
CloudEventsのトランスポートバインディング
CloudEventsはHTTPやAMQP、MQTT、NATS、Kafkaといった複数のプロトコルを介してイベントを運ぶことができます。イベントヘッダやデータをどのように分割し、プロトコルの要素に当てはめるかを定義しているのがトランスポートバインディングです。
たとえばHTTPで運ぶ場合、イベント属性はHTTPヘッダに、そしてイベント本体はHTTPボディに入ります。下記はHTTPでやりとりするCloudEventの例です。
POST /some_resource HTTP/1.1
Host: webhook.example.com
ce-specversion: 1.0
ce-type: com.github.pull.create
ce-source: https://github.com/cloudevents/spec/pull
ce-subject: 123
ce-id: A234-1234-1234
ce-time: 2018-04-05T17:31:00Z
ce-comexampleextension1: value
ce-comexampleothervalue: 5
Content-Type: application/json
{
"much" : "wow"
}
CloudEventsが重宝される理由
CloudEventsには多くの利点があります。イベントの定義づけを明確にすることで、異なるシステム間でのやりとりが快適になります。また、さまざまなプロトコルを選べるので、キーバリュー形式の送信手段があれば広範囲に適用できます。多様なツール間でのイベント送受信を標準化してくれる点は、イベント駆動型のシステムを構築するうえで大きな助けとなります。
データフローの最適化: Apache Kafkaの役割
膨大なリアルタイムデータを処理するニーズから生まれたApache Kafkaは、ただ単にデータを運ぶだけでなく、次々に流れるデータに対応できる仕組みを持っています。高いスループットと低いレイテンシが特徴で、大規模かつ即座のデータを扱う局面に強みを発揮します。
Kafkaは「パブリッシュ-サブスクライブ」モデルに基づいており、イベントの発信者は特定のトピックへ情報を送信し、利用者は当該トピックから情報を取得する仕組みです。これによりデータ経路の独立性が確保され、複雑なシステムでも大規模に運用できます。
さらにKafkaはデータを発着するだけではなく、ある期間データを保持するという面でも優れています。これはデータ解析や障害時の復旧に役立ちます。
標準化を推進するCloud Events
一方のCloud Eventsはデータフローというより標準化を中心に据えています。Cloud Native Computing Foundation (CNCF)が提唱したイベントデータの共通言語であり、サービス間や実装間、異なるプラットフォーム間の連携をスムーズにすることに重点を置いています。
Cloud Eventsのコアはメタデータの集まりで、イベントに関する発生元や種類、識別子、実データなどをまとめます。イベントのストリーミング機能は含まれていませんが、どのイベント処理基盤上でも動作させられるよう、標準のフォーマットを提供しています。
特徴的な違いの比較
項目 | Apache Kafka | Cloud Events |
---|---|---|
主目的 | 強力なデータストリーミング処理 | イベントデータの標準フォーマットを確立 |
スケール対応 | きわめて優秀(多数のイベントを秒単位で処理可能) | イベント処理基盤による |
イベントの保存機能 | システム内蔵 | 標準では非搭載 |
互換性 | Kafka固有の基盤寄り | 非常に高い(共通イベントフォーマット) |
Apache KafkaとCloud Eventsはどちらもイベントドリブンな開発で重要な存在ですが、目的と提供する機能には大きな差があります。高スループットや低レイテンシ、イベントの履歴管理が欲しいならKafkaが向いています。一方、Cloud Eventsはイベントの統一的な形式を提供することで、異なるサービスやプラットフォーム間の柔軟な通信を可能にします。
この後はKafkaのしくみやCloud Eventsの標準化の枠組みをより詳しく解説し、それぞれがイベント処理やデータ処理、そしてイベントドリブン開発にどう寄与するかにふれていきます。
オープンソースとして強力な機能を持ちながら、大量のデータをリアルタイムに扱うことができるApache Kafka。ここでは主要な構成要素を順に見ていきます。
サーバの統括役: Kafkaのコントロール中枢
Kafkaのコントロール中枢は、複数のサーバ(Kafkaブローカー)をうまく連携させる指令塔のような存在です。多くのメッセージを一度に処理し、即時にデータをやり取りできるように調整します。
データの目印: Kafkaトピック
Kafkaでは一つひとつのデータ入力に紐づく「トピック」という概念があります。Kafkaのサブスクリプションモデルにより、複数の利用者が同じトピックを同時に参照できます。送信を最適化するために、トピックは「パーティション」という細かい区切りに分かれています。
データの送信者: Kafkaプロデューサ
プロデューサは、特定トピックへデータを送信する役割です。利用する区分(パーティション)は負荷分散などのアルゴリズムで決定する場合や、わかりやすいルールを使って割り振る場合があります。
データの受信者: Kafkaコンシューマ
コンシューマは、指定したトピックからデータを取得し活用する役割です。いくつかのトピックを同時に読み込み、コンシューマグループという単位で動くことで、同じデータがグループ内で重複なく効率的に処理されます。
負荷を支える: Kafkaブローカー
これらのブローカーは無状態性を持つサーバで、制御中枢(コントロール中枢)に管理されています。1台のブローカーでも1秒間に膨大な読み書き要求を受け止められるうえ、大量のメッセージを保管してもパフォーマンスが下がりにくい仕組みです。
全体を観る: ZooKeeper(ザ・スーパーバイザ)
ZooKeeperは、ブローカーの集まりを監視し、リーダーの選定やトピックとパーティションの情報を追跡します。こうして全体の連携を取り、クラスターの一元管理を実現します。
システム連携役: Kafkaコネクタ
このApache特有の仕組みは、Kafkaとほかのシステム(データベースやファイルシステムなど)を連携させる手段を提供します。大量のデータをKafkaと外部システム間でスムーズにやり取りするのを助けます。
データ処理者: Kafka Streams
Kafka内のデータを変換・集計するためのライブラリがKafka Streamsです。Kafkaのプロデューサ/コンシューマAPIを活用しながら、変形や集約、リアルタイム結合などを可能にする強力なストリーム処理の機能を備えています。
このようにKafkaの各パーツがうまく連動することで、大量のデータを効率的かつ信頼性を保ちながら扱うことができます。これらを把握しておくと、イベント駆動システムにおけるKafkaの活用度が大いに高まります。
CloudEventsは、イベントデータを一貫した形式で表現することで、さまざまなサービスやプラットフォームとの間で情報をやりとりしやすくするための設計図です。イベントがキーとなる構造、つまりユーザー操作やセンサーからの信号、ソフトウェア同士の通信などによってシステムが動く場合に注目されます。
CloudEventsの主な要素
CloudEventsの仕様では、あらゆるイベントで共通して扱われる属性が定義されています。
これらによって、どのようなイベントでどんなデータを含んでいるかが一律にわかるため、異なったシステム間でも連携しやすくなります。
多彩なイベント形式とプロトコル
CloudEventsでは、JSONやAvroといった形式を扱え、HTTP、MQTT、AMQPなど複数の通信プロトコルに対応しています。これにより、単純なWebhookから複雑なイベント駆動型システムまで適用の幅が広いです。
たとえばJSON形式のイベントをHTTP経由で送る場合をイメージするとわかりやすいでしょう。
相互運用性と拡張性
CloudEventsの狙いのひとつは、数多くのプラットフォームやサービス間の相互運用を容易にすることです。統一的なイベント表現方法のおかげで、異なるシステム同士でもスムーズにイベントを交換できます。
基本属性のほかに拡張メタデータを追加する拡張機能も備え、必要に応じて独自情報を含められます。こうした拡張性の高さもさまざまな環境への適用を後押しします。
CloudEventsがイベント駆動型システムに果たす役割
イベント駆動型システムでは、コンポーネント間のやりとりにイベントが使われます。ここでCloudEventsのような標準規格を用いると、イベントを均一的に扱えるので、実装や稼働環境に左右されることなくシステムが連携しやすくなります。
CloudEventsを使えば、開発者はイベントの形式や送受信の細かな実装から解放され、アプリケーション固有のロジックに集中できるメリットがあります。結果的にシステム全体が柔軟で保守しやすくなり、将来的にも拡張しやすい構成を目指せます。
要するに、CloudEventsはイベント駆動システムのニーズを的確に捉えた設計です。共通属性でイベントを表し、さまざまなフォーマットやプロトコルを使えるようにすることで、高い拡張性と連携の容易さをもたらしています。
Apache Kafkaは大量のデータを処理するために設計されています。その中核を担うのがイベント管理の仕組みです。これによりデータの取り扱いがスムーズになり、リアルタイムのインサイトを手に入れやすくなります。ここではKafkaのイベント管理がどう動いているかをご説明します。
Apache Kafkaのイベント制御の基本
Kafkaはパブリッシュ-サブスクライブ(PUBSUB)モデルを使っています。このモデルでは「プロデューサ」がKafkaブローカーにイベントを書き込み、「コンシューマ」が特定のトピックを購読してイベントを読み取ります。ここでデータを蓄える仕組みは分散型のログで、複数のノードに分散されているため高いスループットと冗長性を確保しています。
Kafkaはデータをストリーム(連続した流れ)として捉えます。絶えず流れ込むレコードを一連の流れとして把握し、リアルタイムに処理するイメージです。
Kafkaにおけるイベント処理の流れ
Kafkaでのイベント処理は大きく4つのフェーズに分かれます。
Kafka Streamsによるイベント管理
Kafka Streamsは、Kafkaトピック上のデータを柔軟に加工し、マイクロサービスとして組み立てるためのライブラリです。専用DSL(ドメイン特化言語)を用いて複雑な処理をわかりやすく記述できます。
Kafka Streamsが提供する主な操作には、以下のようなものがあります。
Kafkaのイベント管理を使った例
たとえば販売トランザクションのストリームを扱い、商品カテゴリごとの累積売上をリアルタイムに算出したいケースを考えます。
StreamsBuilder build = new StreamsBuilder();
KStream<String, SaleEvent> purchaseEvents = build.stream("transactions");
KTable<String, Long> salesByCategory = purchaseEvents
.groupBy((key, transaction) -> transaction.getProduct())
.aggregate(
() -> 0L,
(category, event, aggregate) -> aggregate + event.getTotal(),
Materialized.with(Serdes.String(), Serdes.Long()));
salesByCategory.toStream().to("sales-per-category");
この例ではStreamsBuilder
を使ってKafka Streamsアプリケーションを定義し、トピック“transactions”を読み取るKStream
を生成します。そこから商品カテゴリでグループ化し、売上合計を集計してKTable
を得ています。最後にKTable
を再びKStream
へ変換して“sales-per-category”というトピックへ書き出します。
Apache Kafkaのイベント管理における要点
Kafkaはストリームベースの取り扱いにより、シンプルなフィルタ処理から複雑な結合まで多様な作業を実行できる強力な仕組みを提供しています。DSLを備えたKafka Streamsにより、複雑な処理パイプラインをわかりやすく実装できるのがポイントです。こうした仕組みは必要に応じて柔軟に組み合わせられ、大量のデータ処理を効率よく実現します。
今日のソフトウェア開発では、イベントをきっかけにシステムを動作させる設計が主流になっています。こうした仕組みではイベントの取り扱いをどうするかが鍵となります。CloudEventsはイベントデータを標準的に扱う方法を提供し、相互動作性を高める存在として役割を担っています。
標準規格が求められる理由
CloudEventsの一番の価値は、イベントデータの標準化にあります。CloudEventsが登場する以前は、イベントごと、あるいはシステムごとに違う形式が混在していました。その結果、異なるシステムのイベントをまとめて取り込むのが難しく、運用に手間がかかりました。
CloudEventsはこうした課題を解決するため、いずれのシステムでも共通で理解できる形式を提示します。これによって多種多様なイベントソースを一箇所で管理することも容易になります。
たとえば複数のソースから来るイベントを一つのシステムで解析する場合、従来は各ソースのイベント形式を統一する作業が必要でした。しかしCloudEventsのフォーマットを使えば、一貫性を保ったままさまざまなソースのイベントを扱えます。
互換性と移植性
CloudEventsのもう一つの大きな強みは、互換性と移植性の向上です。統一的なイベント形式を与えることで、イベントは異なるプラットフォームやサービス間を容易に行き来できます。
クラウドネイティブなマイクロサービスで構成される現在のアプリケーション環境では、コンポーネントがばらばらのプラットフォーム上にあることも珍しくありません。CloudEventsを使えば、あるコンポーネントが発火したイベントを別のプラットフォーム上のコンポーネントでスムーズに処理できるようになります。
また、HTTPやAMQP、MQTTなど多彩なプロトコルに対応できるのも利点です。これにより移植性が高まり、構成によって柔軟にプロトコルを選べます。
イベントドリブンアーキテクチャを強化
CloudEventsの標準化により、イベントを統一フォーマットで扱い、相互にやりとりできる環境が整備されます。開発者はイベント処理のロジックに注力できるようになるので、拡張性を維持しつつ柔軟にシステムを構築できます。
加えて、CloudEventsはイベントの詳細情報を付加できるため、複雑なイベント駆動アプリの構築も実現しやすいです。たとえばイベントソースに応じた特殊な情報をイベントに含めれば、処理側でその情報を読んで分岐処理を行うことができます。
要するに、イベントデータの標準化や互換性、移植性を推進するCloudEventsは、イベントドリブンアーキテクチャの設計に欠かせない存在といえます。クラウドネイティブなマイクロサービスから比較的シンプルなアプリケーションまで、幅広い環境で利点を発揮します。
Apache Kafkaでデータを動かす要: メッセージの生成者と処理者
Apache Kafkaの仕組みを支える重要な登場人物が「プロデューサ(メッセージの送信者)」と「コンシューマ(メッセージの処理者)」です。プロデューサは必要なデータを生成し、コンシューマはそのデータを取り込み活用します。この2者が組み合わさることで、Kafka上のデータストリームをダイナミックに動かすことが可能になります。
メッセージ生成者(プロデューサ)の役割
プロデューサは名称通り、メッセージを作り出しKafkaに送付する役割を担います。ユーザーの操作履歴を収集するプログラムや、IoTセンサーの計測値を配信するデバイスなど、さまざまな形態で存在します。
プロデューサはKafkaへ継続的にデータを渡し続ける流れを作り、Kafkaブローカーがそのデータを蓄えて後続のコンシューマに渡せるようにします。さらにプロデューサ側で送信先のトピックを指定できるため、要件や設計によって柔軟に振る舞えます。
// JavaによるKafkaのメッセージプロデューサ例
Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<>(properties);
for(int index = 0; index < 100; index++)
producer.send(new ProducerRecord<String, String>("topic-of-choice", Integer.toString(index), Integer.toString(index)));
producer.close();
コンシューマ(メッセージ処理者)の役割
次に、コンシューマ(処理者)はプロデューサが生成したメッセージを読み込み、ログとして保管したり、他のシステムに転送したり、分析にかけたりといった処理を行います。コンシューマは特定のトピックに属するメッセージをどれだけ取得するかを自由に制御できます。
また、複数のコンシューマがいっしょに動くときはコンシューマグループを形成し、メッセージを分散して受け取る仕組みを実装できます。こうすることで大規模データを効率的に処理できます。
// JavaによるKafkaのコンシューマ(処理者)の例
Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("group.id", "test");
properties.put("enable.auto.commit", "true");
properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
Consumer<String, String> consumer = new KafkaConsumer<>(properties);
consumer.subscribe(Arrays.asList("topic-of-choice"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}
プロデューサとコンシューマの連携
Apache Kafkaでは、メッセージを送り込むプロデューサと、それを読み出して処理するコンシューマという2つの存在が絶えずやりとりをしています。プロデューサは新しいデータを継続的に生み、コンシューマはそれを捉えて活用します。この往復がKafkaの強力なストリーム処理を支える原動力です。
プロデューサ | コンシューマ |
---|---|
Kafkaトピックへ新しいデータを送る | Kafkaトピックに入ったデータを取り込み、処理する |
トピックの指定が可能 | 複数トピックを選んで購読可能 |
メッセージ確認方式を選択できる | コンシューマグループで協調動作 |
こうして、Apache Kafkaではプロデューサとコンシューマが噛み合うことでデータの循環を実現し、大量かつリアルタイム性の高いイベント処理が可能になっています。両者をよく理解することがKafkaの活用の第一歩です。
CloudEventsはシステム上で起こる事象や操作を共通フォーマットで定義し、イベントドリブンなアーキテクチャ、とりわけクラウド上で連続稼働するシステムの連携を円滑にする土台です。
CloudEventsプロトコルを紐解く
Cloud Native Computing Foundationが進めるプロジェクトの一つであるCloudEventsは、イベントの中身や追加情報を一定の形式で表す仕様を示します。これを使うことで、異なるプログラム同士が技術スタックに依存せず容易にイベントを解釈し、反応するようにできます。
CloudEventsはIoTやクラウドなど、多種多様な現場から発せられるイベントの取り扱いを想定し、標準的なデータ形式を提供しているのが特徴です。
CloudEventsプロトコルの主要属性
CloudEventsでは、イベントデータ内にいくつかの必須情報を含めることが推奨されています。たとえば以下のようなものがあります。
クラウドフル活用の仕組み
クラウド環境ではサービス間を結びつける役割をイベントに担わせるケースが増えています。CloudEventsの標準フォーマットを使えば、相互のやりとりを統一した枠組みで表現できるので、システム連携がスムーズになります。
たとえばクラウドベースのユーザー管理、注文処理、在庫管理といった各サービスが同時に動く場合を想定しましょう。これらが発生させるイベントをCloudEventsとして一括で扱えば、相互の通知と作業を円滑につなげられます。
CloudEventsの潜在力
CloudEventsの強みは、イベントに含まれる情報をシステム全体で理解できる共通言語に変える点です。その結果、異なる技術基盤でもイベントを即座に解釈し、正しく対応できます。
また、拡張にも柔軟に対応でき、標準で定義されていないメタデータを追加しても、基本仕様を破壊せず問題なく受け渡しできるのが利点です。
総じて、CloudEventsはクラウドネイティブ環境におけるイベント管理を飛躍的に効率化する仕組みとして注目されています。一貫した形式でイベントをやり取りすることで、イベント指向のアーキテクチャをより堅牢かつ柔軟に運用できます。
イベントドリブンなフレームワークでは、データをどう扱い、保存し、引き出して活用するかが大切です。Apache KafkaとCloud Eventsはどちらもデータ処理に強みがありますが、アプローチが異なります。ここでは両者の管理法と、その利点・欠点を見比べます。
Apache Kafkaによるデータ管理手法
Apache Kafkaは大容量かつ高速処理に優れたシステムで、ログベースのデータ構造を採用しています。データが順番に書き込まれるログ方式は、高速な追記や高速アクセスでリアルタイム処理を可能にします。
Kafkaではトピックとパーティションという概念でデータを分類します。トピックはデータのカテゴリで、パーティションはその中の細分化です。この区分により並行処理が可能になり、スループットを向上させます。
// Kafkaトピックの作成例
AdminClient admin = AdminClient.create(properties);
NewTopic newTopic = new NewTopic("myTopic", 3, (short) 1); // 3つのパーティション
admin.createTopics(Collections.singletonList(newTopic));
また、Kafkaのレプリケーション機能によって、障害が起きてもデータ損失を防ぐ仕組みが用意されています。データを複数のブローカーに複製することで可用性を高めています。
Cloud Eventsによるデータ管理手法
対照的に、Cloud Eventsはイベントデータの表現を標準化するものであって、データ保存の仕組みを直接決めるものではありません。あくまで共通フォーマットを提供し、どんなシステムでも解釈しやすくすることに特化しています。
Cloud Eventsでは「id」「source」「type」などの必須フィールドを中心に、キーと値で表すシンプルなデータ構造をとっています。必要に応じてカスタム属性を追加できる柔軟さも併せ持ちます。
{
"specversion" : "1.0",
"type" : "com.example.someevent",
"source" : "/mycontext",
"id" : "C234-1234-1234",
"data" : {...}
}
KafkaとCloud Eventsのデータ管理を比較
特徴 | Apache Kafka | Cloud Events |
---|---|---|
データ構造 | ログベース | キーと値のシンプル形式 |
データの分類 | トピックとパーティション | イベントのタイプ分類 |
データ保持 | レプリカで冗長化 | 実装次第 |
データ形式の柔軟性 | 固定的 | 拡張可能 |
Apache Kafkaは厳格なログ構造とトピック/パーティションの管理で高スループットを狙い、Cloud Eventsは柔軟なフォーマットで幅広い連携性を重視しているといえます。リアルタイムで大量のデータを扱いたいならKafka、軽めのイベントを様々な環境とやりとりしたいならCloud Eventsといった使い分けになります。
リアルタイムイベント処理システムを選ぶ際、拡張性とパフォーマンスは欠かせない判断材料です。Apache KafkaとCloud Eventsを見比べたとき、それぞれ違う方向性で強みを持っています。
Apache Kafka: 拡張性の巨人
大量のデータストリームを素早く扱う機能に優れているのがApache Kafkaです。分散クラスター型の設計をとり、複数のサーバに処理を分散して多量のデータ処理を安定的にこなせるようにしています。
Kafkaにおけるパーティションの仕組みにより、トピックを複数パーティションに分け、サーバごとに担当させることでワークロードを効率的に分散します。これにより大規模でも低レイテンシを保ちやすい構造です。
Kafkaの拡張性を特徴づけるポイントを整理すると、以下の通りです。
機能 | 内容 |
---|---|
クラスター設計 | 複数サーバへの水平スケールが容易 |
パーティション分割 | トピックを複数のパーティションに分割 |
大規模データ対応 | 非常に大きいデータストリームも処理可能 |
Cloud Events: 柔軟性と連携重視
Cloud Eventsは、パフォーマンスというよりイベント管理の標準化とシステム連携の容易さに力点を置いています。あくまでイベントデータを一貫した形式で扱うための規格なので、拡張性はその下で使うプラットフォームやサービスに左右されます。
つまり、Cloud Events単独では大規模データの処理を直接支える機構は持ちませんが、サーバレスなどインフラ側の仕組みと組み合わせれば高いパフォーマンスや拡張性を確保できる可能性があります。
Cloud Eventsのパフォーマンス面を検討する際は、下記のような点を考慮します。
機能 | 内容 |
---|---|
共通イベントモデル | イベント定義・管理を標準化 |
幅広い統合性 | 多様なサービスやプラットフォームに適用可能 |
インフラ依存のパフォーマンス | 実行環境の基盤が性能を左右 |
KafkaとCloud Eventsの比較
拡張性とパフォーマンスの観点からApache KafkaとCloud Eventsを比べると、大量のリアルタイムデータを高速処理したい場合はKafkaが有力です。その分散設計やパーティションによるワークロード分割が強力なスケーラビリティと低レイテンシを実現します。
一方、Cloud Eventsはイベント管理を標準化するアプローチなので、システム間の連携が多彩な場面では有効です。スケーラビリティはあくまで基盤側に依存するため、組み合わせるプラットフォームの選定が重要です。
まとめると、スケーラビリティやパフォーマンス面で何を優先するかによってKafkaとCloud Eventsのどちらを選ぶかは異なるというわけです。
分散システムでは、一部のコンポーネントが障害を起こしても全体が止まらないしくみが求められます。Apache KafkaとCloud Eventsが障害にどう向き合うかを解説し、それぞれのアプローチや特徴を比較します。
Kafkaの障害対策
Apache Kafkaでは、レプリケーションによるデータ複製が障害耐性の基盤になっています。トピックをパーティションに分割し、それぞれを複数ノードに複製(レプリカ)しているため、どこか1つのノードが落ちてもデータを失いません。
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<>(props);
for(int i = 0; i < 100; i++)
producer.send(new ProducerRecord<String, String>("my-topic", Integer.toString(i), Integer.toString(i)));
producer.close();
上記の設定例ではacks
をall
にすることで、すべてのレプリカに書き込まれるまで完了とみなさないため、データの喪失を防ぎます。
さらにKafkaには「インシンク・レプリカ(ISR)」という機能があり、リーダーノードと完全に同期できている複数のレプリカがそれに該当します。もしリーダーが故障してもISR内の別ノードが新たなリーダーとなり、サービスを継続します。
Cloud Eventsの障害耐性
一方でCloud Eventsには直接的な障害耐性の仕掛けは含まれていません。しかし、他のクラウドネイティブ技術(例: Kubernetes)と組み合わせることで障害への対応力を得られます。
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: my-service-trigger
spec:
broker: default
filter:
attributes:
type: dev.knative.samples.hello
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: hello-display
たとえばKnativeのTrigger機能でCloudEventsをやりとりしているサービスが落ちたとしても、Kubernetesが自動的に再起動を担当し、システムの継続性を保ちます。
KafkaとCloud Eventsのフォールトトレランス比較
項目 | Apache Kafka | Cloud Events |
---|---|---|
データの複製 | 標準搭載 | 実装依存 |
自動復旧 | 組み込み機能あり | 基盤次第 |
同期レプリカ | ISRを運用 | 適用範囲外 |
Kafkaは内蔵されたレプリケーション機能により障害にも強いシステムを築けます。対してCloud Eventsは仕様そのものに障害対策を組み込んでいないため、利用するプラットフォームやサービスで障害対応を補う必要があります。柔軟性は高いものの、その分、設計段階での考慮事項が増えるといえます。
まとめると、信頼性を優先しデータ損失が許されないケースはKafkaが強く、Cloud Eventsは他のクラウド基盤等と組み合わせることで障害耐性を実現するイメージになります。
イベントドリブンの設計は、システムの柔軟性を高めて変化に素早く追従しやすくします。今回は、Eコマースを例にしてApache Kafkaを活用したイベントドリブンアーキテクチャを見ていきましょう。
ここで想定するのは、世界中で何百万件もの取引が日々行われるオンラインマーケットです。ユーザー登録や注文、在庫管理、決済、配送手続きなど多数の機能が存在し、それぞれがイベントを生成します。
従来の同期的なアプローチだと、大量の同時リクエストや分散した機能群を扱うのが難しくなります。しかし、このマーケットがリアルタイムで何が起きているかをしっかり把握する仕組みを作らないと、顧客の満足度を下げかねません。
こうした状況でApache Kafkaが中心的なデータストリームプラットフォームとして選ばれました。Kafkaは大量のイベントを効率的に取り込み、連携するサービスに安定的に提供できます。
例えば以下のような流れで機能します。
Apache Kafka導入後の効果
この事例からわかるように、Kafkaを採用したイベントドリブンアーキテクチャは、リアルタイム性、拡張性、信頼性、そして独立性を高める効果があります。Eコマースだけでなく、さまざまなドメインで同様の恩恵が期待できます。
イベント駆動の世界で、CloudEventsは標準的なデータスキーマとして注目されています。ここでは、CloudEventsの現実的な活用例をEコマースのケースで見ていきます。
事例: Eコマースプラットフォーム
あるEコマースプラットフォームには多数のマイクロサービスが存在します。たとえば顧客管理、商品在庫管理、決済処理、売上管理などです。これらのサービスはお互いイベントを通知しあい、全体として注文処理や配送などをスムーズに行います。
イベント駆動を導入すると、トリガーが発生した瞬間に各サービスが連携しながら動くため、迅速に対応できるメリットがあります。とはいえサービスごとにイベント形式が異なると、統合や保守が難しくなる懸念があります。
そこでCloudEventsが役に立ちます。共通のイベント形式を使うことで、複数サービス間でイベントをやりとりする際の複雑さを減らせます。
CloudEventsをどう使うか
まずはイベントのデータ構造を定義します。CloudEventsではid
、source
、specversion
、type
、data
といったキーを使い、必要に応じて拡張属性を追加できます。たとえば以下のようなJSONです。
{
"specversion" : "1.0",
"type" : "com.example.sampleevent",
"source" : "/url/place",
"id" : "D345-2345-2345",
"data" : {
"webinfoX" : "xyz",
"webinfoY" : 456,
"webinfoZ" : false
}
}
こうして定義したイベントをブローカーなどに送信し、関連するマイクロサービスが受け取って処理をします。たとえば注文が新規に発行されたら、決済サービスがCloudEventsを使ったイベントを受け取り、支払いフローを実行するといった具合です。
CloudEvents導入の利点
CloudEventsを使うと以下のようなメリットがあります。
まず、イベントの扱いが一元化されるので、開発や保守の効率が上がります。異なるマイクロサービスが同じフォーマットを扱うため、データのやりとりで起こりがちな不整合を減らせます。
また、CloudEventsはHTTPやJSONといった一般的な仕様に対応しているので、既存システムとの統合もしやすいです。
さらに、イベントによる非同期連携により、負荷ピーク時もスケーラブルに動作させられる利点があります。マイクロサービス同士が疎結合になるため、特定サービスが高負荷でもシステム全体へ影響を及ぼしにくいです。
このようにCloudEventsはマイクロサービスの集まりでもシンプルにイベントを記述でき、仕組み全体の柔軟性を高めてくれます。
拡張と進化を続けるApache Kafka
Apache Kafkaは強力かつオープンソースということもあり、さまざまなシステムやテクノロジーと容易に連携できます。豊富なコミュニティサポートとプラグインがあり、企業が既存のシステムに組み込みやすい工夫がされています。
Kafka Connectを最大限に活用
Kafka Connectは、Kafkaと各種データストアとのデータ連携をシンプルにする仕組みです。スケールアウトにも対応していて、大容量データの流れをスムーズに扱えます。データベースとの同期やログの集約など、Connectorを使って簡単に実装できます。
Kafka Streamsの活用
Kafka Streamsはアプリやマイクロサービスの構築に役立つクライアントライブラリです。サーバサイドの特別なインフラを用意せずとも、アプリ側でストリーム処理を行える利便性を持っています。
Kafkaとビッグデータツールとの連携
KafkaはHadoopやSpark、Stormなどのビッグデータ用フレームワークともよく組み合わせられます。大量データを即座に取り込み、分析する仕組みを実現できるため、大企業やデータ分析分野で使用されるケースが多いです。
Cloud Eventsの連携と発展
イベントデータを定義する標準として注目を集めるCloud Eventsも、数多くの連携や拡張の選択肢を提供しています。これにより多彩なクラウドサービスや環境とスムーズに統合できます。
CloudEvents SDK活用
CloudEventsはGo、JavaScript、Java、Pythonなどいろいろな言語のSDKを提供しています。開発者は好きな言語でCloudEventsフォーマットを扱えるため、導入しやすいです。
サーバレス環境との組み合わせ
AWS LambdaやGoogle Cloud Functions、Azure Functionsなどのサーバレス環境でもCloudEventsは簡単に利用できます。イベントベースで動くアプリをサーバレスで稼働させると、イベント発生時に自動的にリソースを拡張できるなどメリットが大きいです。
イベントソースとの連携
CloudEventsは、データベースやメッセージキュー、IoTデバイスなど幅広いイベントソースと連動可能です。これにより、さまざまな種類のイベントを統合的に扱えるイベント駆動型エコシステムを作ることができます。
こうして見てみると、KafkaもCloud Eventsも豊富な連携手段を備えています。それぞれが進化し、多様なシステムや環境との親和性を高めているため、組み合わせ次第で柔軟かつスケーラブルなイベント駆動アーキテクチャを実現できます。
イベントドリブンなシステム設計では、データの機密性や完全性を守るセキュリティ対策が大事です。Apache KafkaとCloud Eventsでの対策を比べると、両者ともデータの保護を重視していますが、具体的な方法には違いがあります。
Apache Kafkaのセキュリティ
Apache Kafkaでは複数の層でセキュリティを確保します:
以下のようにSASL/SCRAM方式を設定して、Kafkaの認証を強化できます。
props.put("security.protocol", "SASL_SSL");
props.put("sasl.mechanism", "SCRAM-SHA-256");
props.put("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"kafka\" password=\"kafka-secret\";");
Cloud Eventsのセキュリティ
一方でCloud Events自体には固有のセキュリティメカニズムがありません。そのかわりに、HTTPやMQTT、AMQPなどイベントをやりとりする際のプロトコルでの暗号化や認証、あるいはクラウド基盤のセキュリティ機能に依存します。
とはいえ、Cloud Eventsには以下のような属性があり、セキュリティを補完するのに役立ちます。
以下はCloud Eventsの具体例です。
{
"specversion" : "1.0",
"type" : "com.github.pull.create",
"source" : "/repos/john-doe/my-repo/pulls/1",
"subject" : "pull-request",
"id" : "A234-1234-1234",
"time" : "2018-04-05T17:31:00Z",
"datacontenttype" : "application/json",
"dataschema" : "http://json-schema.org/draft-07/schema#",
"data" : "{...}"
}
KafkaとCloud Eventsのセキュリティ比較
項目 | Apache Kafka | Cloud Events |
---|---|---|
通信暗号化 | あり(TLS対応) | プロトコル任せ |
認証 | SASLなど標準機能あり | クラウド等の基盤に依存 |
アクセス制御 | ACL機能 | 標準仕様では特に提供なし |
データ暗号化 | オプションで実装可能 | クラウド基盤任せ |
データ検証 | 本質的には未対応 | 属性で一部対応 |
要するに、Apache Kafkaは独自に強固なセキュリティ基盤を備えており、大規模かつ高い信頼度を求める場面に向いています。一方、Cloud Eventsはイベント定義の標準化が目的なので、セキュリティ機能は周辺サービスや基盤に委ねられています。
イベントドリブンアーキテクチャ(EDA)を設計する際、Kafka ToolsやStream Cloudなどのツールを有効に活用することで、複雑なデータストリームにも対応できます。ここでは実装の際に押さえておきたいポイントを挙げます。
システム要件の把握
最初に重要なのは、扱うデータ量や処理速度、既存システムとの連携先などを明確にすることです。大量データを高速に扱うならKafkaが適している場合が多く、クラウドネイティブでイベント形式の統合が欲しいならStream Cloudが有力かもしれません。
EDAの設計
次に、システム内の各コンポーネントと、どう相互にイベントをやりとりするかを洗い出します。
Kafka Toolsであれば、データを送り出すプロデューサやデータを読むコンシューマ、それをホストするブローカー群が中心になります。
Stream Cloudを使うなら、イベントを作る側(トリガー)と、それを使って処理する側(リスナー)、そして両者をつなぐコネクタの存在を定義します。
Kafka Tools導入時のポイント
Kafka Toolsの利用時は以下を意識するとよいでしょう。
Stream Cloud導入時のポイント
Stream Cloud製品を利用する場合、以下を押さえましょう。
監視とテスト
導入後は、定期的なロードテストで大量データ時の動作を確かめ、モニタリングで常時システムの状況を把握することが大切です。
これらのベストプラクティスを参考に、Kafka ToolsやStream Cloudを円滑に導入し、それぞれの強みを最大限に発揮できるEDAを構築してみてください。
技術が進むにつれ、システム設計に関するトレンドも変わっていきます。大量データ(ビッグデータ)の加速やデバイスの増加(IoT)、即時のデータ処理ニーズなどにより、イベントドリブンなアーキテクチャの需要はさらに高まっていくでしょう。
ビッグデータの増大
SNSやIoT、各種業務システムから生み出される膨大なデータを扱うには、従来の仕組みでは追いつきません。イベントドリブンな設計なら流れ込むデータをリアルタイムで処理し、タイムリーな意思決定につなげやすくなります。
IoTの拡大
あらゆるモノがインターネットにつながる時代では、デバイスからの情報が膨大なイベントとなって押し寄せます。イベントドリブンアーキテクチャは、この大量のイベントを処理・分析して瞬時にフィードバックする仕組みにマッチします。故障を予測してメンテナンスするといった予知保全の世界でも活躍が期待できます。
即時性への要求
デジタル領域では変化が激しく、イベントが発生してからすぐ反応することが重要になります。イベントドリブンアーキテクチャがあれば、リアルタイムに近いスピードで処理を実行し、たとえば異常検知やレコメンドなどを瞬時に行うことができます。
Apache KafkaとCloud Eventsの役割
将来的には、Apache Kafkaのように大量データを超高速で処理する仕組みと、Cloud Eventsのようにイベント定義を標準化する仕組みがより緊密に連携する可能性があります。こうした組み合わせにより、拡張性と柔軟性、そして効率的なリアルタイム処理を同時に達成できるでしょう。
さらに、AIや機械学習の進化により、イベントドリブンで得られる大量データを自動解析し、その結果を元に処理フローを自動で最適化するような未来像も考えられます。
まとめると、ビッグデータ、IoT、リアルタイムなデータ処理がますます重視される社会で、イベントドリブンアーキテクチャは今後さらに広がっていきそうです。Apache KafkaやCloud Eventsも発展を続け、将来のシステム設計を支える存在であり続けるでしょう。
イベントドリブンなシステムを支えるテクノロジーとしては、Apache KafkaとCloud Eventsの2つが注目されています。どちらを選ぶかはプロジェクトのニーズ次第といえます。
Apache Kafka: 大規模ストリーミングに優れた選択肢
Apache Kafkaは、巨大なデータストリームをほぼリアルタイムで取り込み・配信できるプラットフォームです。履歴管理機能や高い拡張性も備えていて、データの再生や詳細な分析が必要なケースには最適といえます。
ただし、学習コストや運用負荷は軽視できません。クラスター構築や監視などに一定の知識とリソースが必要です。APIも高度で、扱いにはスキルが求められます。
Cloud Events: 柔軟性と軽快さを重視
Cloud Eventsはイベントを一つの標準形式で記述し、複数の環境やサービス間でやりとりしやすくする目的に特化しています。実装が簡素で、クラウドネイティブな環境で特に使いやすい点が魅力です。
一方で障害耐性や大規模データ処理といった点ではKafkaほどの機能を持ちません。シンプルなインテグレーションや中小規模のプロジェクトに向いているといえます。
選択の指針
リアルタイムかつ大容量のデータを切り捨てなく運用し、高度なストリーム処理も求められるならKafkaを検討すべきです。対して、柔軟で軽やかな仕組みを短期開発で導入し、複数プラットフォーム間の連携を重視したい場合にはCloud Eventsが向いています。
最終的には、両者の強みと弱みを含め、貴社のプロジェクトの要求に合った選択をすることが大切です。それぞれの特性をよく理解し、プロジェクトに最適なイベントドリブンアーキテクチャを実現してください。
最新情報を購読