イベント ハブ (Apache Kafka トピック) にパーティションを動的に追加する

Event Hubs は、パーティション化されたコンシューマー パターンを使用してメッセージ ストリーミングを実現します。このパターンでは、各コンシューマーはメッセージ ストリームの特定のサブセット (またはパーティション) のみを読み取ります。 このパターンでは、イベント処理能力を水平方向に拡張 (スケールアウト) することができ、キューおよびトピックでは利用できない、ストリームに重点を置いたその他の機能が利用できます。 パーティションは、イベント ハブで保持される順序付けされた一連のイベントです。 新しいイベントが到着すると、このシーケンスの末尾に追加されます。 パーティションの概要について詳しくは、「パーティション」を参照してください

パーティションの数は、イベント ハブの作成時に指定できます。 場合によっては、イベント ハブを作成した後で、パーティションの追加が必要になることもあります。 この記事では、既存のイベント ハブにパーティションを動的に追加する方法について説明します。

重要

パーティションを動的に追加する方法は、Event Hubs の premium および専用レベルでのみ利用できます。

Note

Apache Kafka クライアントの場合、イベント ハブKafka トピックに相当します。 Azure Event Hubs と Apache Kafka の間のマッピングの詳細については、「Kafka と Event Hubs の概念のマッピング」を参照してください

パーティション数の更新

このセクションでは、イベント ハブのパーティション数を更新するための各種の方法 (PowerShell、CLI など) について説明します。

PowerShell

Set-AzEventHub PowerShell コマンドを使用して、イベント ハブのパーティションを更新します。

Set-AzEventHub -ResourceGroupName MyResourceGroupName -Namespace MyNamespaceName -Name MyEventHubName -partitionCount 12

CLI

イベント ハブでパーティションを更新するには、az eventhubs eventhub update CLI コマンドを使用します。

az eventhubs eventhub update --resource-group MyResourceGroupName --namespace-name MyNamespaceName --name MyEventHubName --partition-count 12

Resource Manager テンプレート

Resource Manager テンプレートで partitionCount プロパティの値を更新し、テンプレートを再デプロイしてリソースを更新します。

    {
        "apiVersion": "2017-04-01",
        "type": "Microsoft.EventHub/namespaces/eventhubs",
        "name": "[concat(parameters('namespaceName'), '/', parameters('eventHubName'))]",
        "location": "[parameters('location')]",
        "dependsOn": [
            "[resourceId('Microsoft.EventHub/namespaces', parameters('namespaceName'))]"
        ],
        "properties": {
            "messageRetentionInDays": 7,
            "partitionCount": 12
        }
    }

Apache Kafka

AlterTopics API (たとえば、kafka-topics CLI ツール) を使用して、パーティション数を増やします。 詳細については、「Kafka トピックの変更」を参照してください。

Event Hubs クライアント

イベント ハブでパーティション数が更新されたときに、Event Hubs クライアントがどのように動作するかを見てみましょう。

既存のハブにパーティションを追加すると、イベント ハブ クライアントがサービスから MessagingException を受け取ります。これは、エンティティ メタデータが変更されたことをクライアントに通知するものです (エンティティはイベント ハブで、メタデータはパーティション情報)。 クライアントは自動的に AMQP リンクを開き、変更されたメタデータ情報を取得します。 その後、クライアントは正常に動作します。

センダー/プロデューサー クライアント

Event Hubs には、次の 3 つのセンダー オプションがあります。

  • パーティション センダー – このシナリオでは、クライアントが直接パーティションにイベントを送信します。 パーティションは識別可能であり、イベントはそれらに直接送信することができますが、このパターンはお勧めしません。 パーティションを追加しても、このシナリオには影響しません。 新しく追加されたパーティションを検出できるように、アプリケーションを再起動することをお勧めします。
  • パーティション キー センダー – このシナリオでは、クライアントがキーを使用してイベントを送信します。これにより、そのキーに属するすべてのイベントが同じパーティションになります。 この場合、サービスはキーをハッシュし、対応するパーティションにルーティングします。 場合によっては、パーティション数の更新により、ハッシュが変更されて順序の問題が発生する可能性があります。 そのため、順序付けを考慮する必要がある場合は、パーティション数を増やす前に、アプリケーションで使用されるのがすべて既存のパーティションのイベントであることを確認してください。
  • ラウンドロビン センダー (既定) – このシナリオでは、Event Hubs サービスがパーティション間でイベントをラウンドロビンします。負荷分散アルゴリズムも使用します。 Event Hubs サービスはパーティション数の変更を認識し、パーティション数が変更されてから数秒以内に、新しいパーティションに送信するようになります。

受信者/コンシューマー クライアント

Event Hubs には、ダイレクト レシーバーと、イベント プロセッサという簡単なコンシューマー ライブラリが用意されています。

  • ダイレクト レシーバー – ダイレクト レシーバーは特定のパーティションをリッスンします。 このレシーバーのランタイム動作は、パーティションがイベントハブ用にスケールアウトされても影響を受けません。 ダイレクト レシーバーを使用するアプリケーションでは、新しいパーティションを取得し、それに応じて受信者を割り当てる必要があります。

  • イベント プロセッサ ホスト - このクライアントでは、エンティティ メタデータは自動的に更新されません。 そのため、パーティション数の増加は感知されません。 イベント プロセッサ インスタンスが再作成されると、エンティティ メタデータのフェッチが発生し、それにより、新たに追加されたパーティションの新しい BLOB が作成されます。 既存の BLOB は影響を受けません。 新しく追加されたパーティションがすべてのインスタンスで認識され、コンシューマー間で負荷分散が正しく処理されるようにするには、すべてのイベント プロセッサ インスタンスを再起動することをお勧めします。

    以前のバージョンの .NET SDK (WindowsAzure.ServiceBus) を使用している場合、チェックポイントのパーティション数がサービスからフェッチされたパーティション数と一致しない場合には、既存のチェックポイントがイベント プロセッサ ホストによって再起動時に削除されます。 この動作は、アプリケーションに影響を与える可能性があります。

    2026 年 9 月 30 日に、Azure SDK ガイドラインに準拠していない Azure Service Bus SDK ライブラリ WindowsAzure.ServiceBus、Microsoft.Azure.ServiceBus、および com.microsoft.azure.servicebus は廃止されます。 SBMP プロトコルのサポートも終了するため、2026 年 9 月 30 日以降はこのプロトコルを使用できなくなります。 この日付より前に、重要なセキュリティ更新プログラムと強化された機能が提供される、最新の Azure SDK ライブラリに移行してください。

    古いライブラリは 2026 年 9 月 30 日以降も引き続き使用できますが、Microsoft から公式のサポートと更新プログラムは提供されなくなります。 詳細については、サポート廃止のお知らせに関するページを参照してください。

Apache Kafka クライアント

このセクションでは、イベント ハブのパーティション数が更新された際に、Azure Event Hubs の Kafka エンドポイントを使用する Apache Kafka クライアントがどのように動作するかについて説明します。

Apache Kafka プロトコル経由で Event Hubs を使用する Kafka クライアントでは、AMQP プロトコルを使用するイベント ハブ クライアントと動作が異なります。 Kafka クライアントは、metadata.max.age.ms ミリ秒ごとにメタデータを更新します。 この値は、クライアント構成で指定します。 librdkafka のライブラリでも、同じ構成が使用されます。 メタデータの更新時には、サービスの変更 (パーティション数の増加を含む) がクライアントに通知されます。 構成の一覧については、「Event Hubs に対応した Apache Kafka の構成」を参照してください。

センダー/プロデューサー クライアント

プロデューサーは、生成されたレコードのセットごとに、パーティション ターゲットを送信要求に含めることを常に指示します。 そのため、すべてのパーティション分割は、ブローカーのメタデータに対するプロデューサーのビューを使用して、クライアント側で行われます。 新しいパーティションがプロデューサーのメタデータ ビューに追加されると、それらはプロデューサー要求で使用できるようになります。

コンシューマー/受信者クライアント

コンシューマー グループのメンバーでメタデータ更新が実行され、新しく作成されたパーティションが取得されると、そのメンバーによってグループの再調整が開始されます。 その後、コンシューマー メタデータがすべてのグループ メンバーに対して更新され、割り当てられた再調整リーダーによって新しいパーティションが割り当てられます。

Recommendations

  • プロデューサー アプリケーションでパーティション キーを使用し、キー ハッシュによってパーティション内の順序付けを維持する場合は、パーティションを動的に追加することは推奨されません。

    重要

    既存のデータの順序は維持されますが、パーティションの追加によってパーティション数が変更された後にハッシュされたメッセージについては、パーティション ハッシュは維持されません。

  • 次の場合は、既存のトピックまたはイベント ハブ インスタンスにパーティションを追加することをお勧めします。

    • 既定のイベント送信方法を使用する場合
    • Kafka の既定のパーティション分割戦略 (例: Sticky Assignor 戦略)

次のステップ

パーティションの詳細については、「パーティション」をご覧ください。