Apache Kafka 用の Azure Event Hubs とは
この記事では、独自の Kafka クラスターを設定せずに、Azure Event Hubs を使って Apache Kafka アプリケーションからデータをストリーミングする方法について説明します。
概要
Azure Event Hubs では、イベント ハブ上に Apache Kafka エンドポイントを提供します。これにより、ユーザーは Kafka プロトコルを使用してイベント ハブに接続できます。 多くの場合、コードを変更せずに、アプリケーションからイベント ハブの Kafka エンドポイントを使用できます。 変更するのは構成のみです。つまり、Kafka クラスターを指すのではなく、イベント ハブによって公開されている Kafka エンドポイントを指すように、構成の接続文字列を更新します。 その後、Kafka プロトコルを使用するアプリケーションからイベント ハブへのイベントのストリーミングを開始できます。これらは、Kafka トピックに相当します。
Apache Kafka アプリケーションを Azure Event Hubs に移行する方法の詳細については、「移行ガイド」を参照してください。
Note
- この機能は、Standard、Premium、および Dedicated レベルでのみサポートされています。
- Apache Kafka エコシステム用 Event Hubs では、Apache Kafka バージョン 1.0 以降がサポートされています。
Apache Kafka と Azure Event Hubs の概念のマッピング
概念的には、Apache Kafka と Event Hubs は非常に似ています。 どちらもストリーミング データ用に作成されたパーティション分割されたログであり、クライアントにより、それを使用して保持されているログのどの部分を読み取るかが制御されます。 次の表に、Apache Kafka の概念と Event Hubs の概念のマッピングを示します。
Apache Kafka の概念 | Event Hubs での概念 |
---|---|
クラスター | 名前空間 |
トピック | イベント ハブ |
Partition | Partition |
コンシューマー グループ | コンシューマー グループ |
Offset | オフセット |
Azure Event Hubs 上でサポートされている Apache Kafka の機能
Kafka Streams
Kafka Streams は、Apache Kafka オープンソース プロジェクトの一部であるストリーム分析用クライアント ライブラリですが、Apache Kafka のイベント ブローカーとは別のものです。
Note
Kafka Streams は現在、Premium および Dedicated レベルでのパブリック プレビュー段階です。
Azure Event Hubs は Kafka Streams クライアント ライブラリをサポートしています。詳細と概念についてはこちらで確認できます。
Azure Event Hubs のお客様が Kafka Streams のサポートを要求する最も一般的な理由は、Confluent の "ksqlDB" 製品に関心をお持ちであるためです。 "ksqlDB" は、"Confluent の製品やサービスと競合するサービスとしてのソフトウェア、サービスとしてのプラットフォーム、サービスとしてのインフラストラクチャ、またはその他の類似のオンライン サービスを提供する" ベンダーが "ksqlDB" のサポートを使用または提供することが許可されないようにライセンスされている固有の共有ソース プロジェクトです。 実際には、ksqlDB を使用する場合は、Kafka を自分で運用するか、Confluent のクラウド オファリングを使用する必要があります。 ライセンス条項は、ライセンスによって除外された目的でサービスを提供する Azure のお客様にも影響する可能性があります。
スタンドアロンまたは KsqlDB なしの Kafka Streams は、多くの代替フレームワークやサービスより機能が少なく、そのほとんどには、組み込みのストリーミング SQL インターフェイスが用意されており、現在はそのすべてが Azure Event Hubs に統合されています。
- Azure Stream Analytics
- Azure Synapse Analytics (Event Hubs キャプチャ経由)
- Azure Databricks
- Apache Samza
- Apache Storm
- Apache Spark
- Apache Flink
- HDInsight on Azure Kubernetes Service 上の Apache Flink
- Akka Streams
Kafka Transactions
Note
Kafka Transactions は現在、Premium および Dedicated レベルでのパブリック プレビュー段階です。
Azure Event Hubs は Kafka Transactions をサポートしています。 サポートと概念の詳細についてはこちらで確認できます
Compression
Note
現在、Event Hubs の Kafka 圧縮は Premium と Dedicated のレベルでのみサポートされています。
Apache Kafka クライアント内でのクライアント側の圧縮機能は、プロデューサー側で複数メッセージのバッチを 1 つのメッセージに圧縮し、コンシューマー側でそのバッチの圧縮を解除することで、コンピューティング リソースと帯域幅を節約します。 Apache Kafka ブローカーにより、バッチが特別なメッセージとして扱われます。
Kafka プロデューサー アプリケーション開発者は、compression.type プロパティを設定することで、メッセージ圧縮を有効にすることができます。 Azure Event Hubs では現在、gzip
圧縮がサポートされています。
Compression.type = none | gzip
この機能がサポートされているのは Apache Kafka トラフィック プロデューサーおよびコンシューマー トラフィックにおいてだけですが、AMQP コンシューマーは圧縮された Kafka トラフィックを圧縮解除されたメッセージとして使用できます。
Apache Kafka と Azure Event Hubs の主な違い
Apache Kafka は通常インストールして運用する必要があるソフトウェアですが、Event Hubs はフル マネージドのクラウドネイティブ サービスです。 管理および監視する必要のあるサーバー、ディスク、ネットワークはなく、考慮または構成する必要のあるブローカーもありません。 完全修飾ドメイン名を持つエンドポイントである名前空間を作成し、その名前空間内に Event Hubs (トピック) を作成します。
Event Hubs と名前空間について詳しくは、「Event Hubs の機能」をご覧ください。 クラウド サービスとしての Event Hubs は、単一の安定した仮想 IP アドレスをエンドポイントとして使用するため、クライアントは、ブローカーやクラスター内のマシンについて知っておく必要はありません。 Event Hubs によって同じプロトコルが実装されますが、この違いは、すべてのパーティションに対するすべての Kafka トラフィックが、クラスターのすべてのブローカーに対してファイアウォール アクセスを必要とするのではなく、この 1 つのエンドポイント経由で予測どおりにルーティングされることを意味します。
スケールイン Event Hubs、購入したスループット ユニット (TU) または処理ユニットの数によって制御されます。 Standard レベルの名前空間に対して Auto-Inflate 機能を有効にした場合、スループットの制限に達すると、Azure Event Hubs が自動的に TU をスケールアップします。 この機能は、Apache Kafka プロトコル サポートでも機能します。 Premium レベルの名前空間に関しては、名前空間に割り当てられた処理ユニットの数を増やすことができます。
Apache Kafka はワークロードに適したソリューションか
Apache Kafka を使用したアプリケーションの構築だけでなく、Azure Event Hubs は Azure Service Bus と Azure Event Grid も含まれるサービスの一部であることを理解することも役に立ちます。
Apache Kafka の商用ディストリビューションの一部のプロバイダーは、Apache Kafka がすべてのメッセージング プラットフォームのニーズに対するワンストップショップであると示唆していますが、実際には、Apache Kafka に、たとえば競合コンシューマー キュー パターンは実装されておらず、単純なオフセット以外でサーバーで評価されたルールに基づいて受信メッセージにサブスクライバーがアクセスできるレベルでのパブリッシュ - サブスクライブはサポートされておらず、メッセージまたはサイドライン障害メッセージによって開始されたジョブのライフサイクルを配信不能キューまで追跡する機能はありません。これらはすべて、多くのエンタープライズ メッセージング シナリオで基本的なものです。
パターン間の違い、およびどのサービスでどのパターンが最もよくカバーされているかを理解するには、「Azure での非同期メッセージングのオプション」ガイダンスを参照してください。 Apache Kafka ユーザーがこれまで Kafka で実現した通信パスは、Event Grid または Service Bus を使用することで、基本的な複雑さが非常に低く、より強力な機能で実現できます。
Apache Kafka インターフェイス用 Event Hubs を介して利用できない Apache Kafka の特定の機能が必要な場合、または実装パターンが Event Hubs のクォータを超える場合は、ネイティブ Apache Kafka クラスターを Azure HDInsight で実行することもできます。
セキュリティと認証
Kafka 用 Event Hubs からイベントを発行または使用するたびに、クライアントでは、Event Hubs リソースへのアクセスが試行されます。 認可されたエンティティを使用してリソースがアクセスされていることを確認する必要があります。 クライアントで Apache Kafka プロトコルを使用している場合、SASL のメカニズムを使用して認証と暗号化のための構成を設定できます。 Event Hubs for Kafka を使用する場合に TLS 暗号化が必要な場合は (Event Hubs で転送されるデータはすべて TLS で暗号化されるため)、構成ファイルに SASL_SSL オプションを指定することで実現できます。
Azure Event Hubs には、セキュリティで保護されたリソースへのアクセスを承認するためのオプションが複数用意されています。
- OAuth 2.0
- Shared Access Signature (SAS)
OAuth 2.0
Event Hubs は、Microsoft Entra ID と連携するため、Azure AD の OAuth 2.0 に準拠した一元的な承認サーバーを利用できます。 Microsoft Entra ID では、Azure のロールベースのアクセス制御 (Azure RBAC) を使用して、粒度の細かいアクセス許可をクライアント ID に与えることができます。 protocol に SASL_SSL を、mechanism に OAUTHBEARER を指定すれば、この機能を Kafka クライアントで使用することができます。 Azure ロールとレベルを使用したアクセスのスコープ設定について詳しくは、Microsoft Entra ID によるアクセスの承認に関するページを参照してください。
bootstrap.servers=NAMESPACENAME.servicebus.windows.net:9093
security.protocol=SASL_SSL
sasl.mechanism=OAUTHBEARER
sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required;
sasl.login.callback.handler.class=CustomAuthenticateCallbackHandler
Note
これらの構成プロパティは、Java プログラミング言語用です。 Kafka 用 Event Hubs で、異なるプログラミング言語を用いて OAuth を使用する方法を紹介した例については、GitHub 上のサンプルを参照してください。
Shared Access Signature (SAS)
Event Hubs には、Shared Access Signature (SAS) も用意されており、Kafka 用 Event Hubs リソースへの委任アクセスを実現することができます。 OAuth 2.0 トークンベースのメカニズムを使用したアクセス承認の方が、SAS よりもセキュリティが高く、使いやすさの点でも有利です。 また、ACL ベースの承認はユーザーが維持、管理する必要がありますが、組み込みロールであれば ACL ベースの承認は必要ありません。 protocol に SASL_SSL を、mechanism に PLAIN を指定すれば、この機能を Kafka クライアントで使用することができます。
bootstrap.servers=NAMESPACENAME.servicebus.windows.net:9093
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="{YOUR.EVENTHUBS.CONNECTION.STRING}";
重要
{YOUR.EVENTHUBS.CONNECTION.STRING}
を Event Hubs 名前空間への接続文字列に置き換えます。 接続文字列を取得する手順については、「Event Hubs の接続文字列の取得」を参照してください。 構成の例には、sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://mynamespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=XXXXXXXXXXXXXXXX";
などがあります。
Note
Kafka クライアントで SAS 認証を使用する場合、SAS キーの再生成時に確立された接続は切断されません。
Note
Apache Kafka エンドポイント用の Event Hubs の使用時には、生成される共有アクセス署名トークンはサポートされません。
サンプル
SAS または OAuth を使用してイベント ハブを作成しアクセスする手順のチュートリアルについては、「クイックスタート: Kafka プロトコルを使用した Event Hubs によるデータ ストリーミング」を参照してください。
その他の Azure Event Hubs の機能
Event Hubs for Apache Kafka 機能は、Azure Event Hubs で同時に利用可能な 3 つのプロトコルのうちの 1 つです (その他 2 つは HTTP と AMQP)。 これらのプロトコルのいずれかで書き込んだものを、別のもので読み取ることができるので、現在の Apache Kafka プロデューサーを使用して Apache Kafka 経由で引き続き発行できますが、閲覧者には Azure Stream Analytics や Azure Functions などの Event Hubs の AMQP インターフェイスとのネイティブ統合によるメリットがあります。 逆に、Azure Event Hubs をターゲット エンドポイントとして AMQP ルーティング ネットワークに簡単に統合し、Apache Kafka 統合を通じてデータを読み取ることができます。
さらに、キャプチャ (Azure Blob Storage と Azure Data Lake Storage により非常にコスト効率のよい長期的なアーカイブが可能です) や geo ディザスター リカバリーなどの Event Hubs の機能も、Kafka 機能用の Event Hubs で動作します。
べき等性
Apache Kafka 用 Azure Event Hubs では、べき等プロデューサーとべき等コンシューマーの両方がサポートされます。
Azure Event Hubs の主要な原則の 1 つは、少なくとも 1 回の配信という概念です。 この方法により、イベントが常に確実に配信されます。 また、イベントは、関数などのコンシューマーによって複数回受信されたり、繰り返し受信されることさえもあります。 このため、コンシューマーは、べき等コンシューマー パターンをサポートすることが重要です。
関連するコンテンツ
この記事では、Kafka 用 Event Hubs の概要について説明しました。 詳細については、Azure Event Hubs 用 Apache Kafka 開発者ガイドを参照してください。
SAS または OAuth を使用してイベント ハブを作成しアクセスする手順のチュートリアルについては、「クイックスタート: Kafka プロトコルを使用した Event Hubs によるデータ ストリーミング」を参照してください。
また、GitHub の OAuth サンプルも参照してください。