Azure Service Bus と Event Grid の統合の概要
Service Bus では、キューまたはサブスクリプションにメッセージがあり、レシーバーがないときに、Event Grid にイベントを発行できます。 Event Grid サブスクリプションを Service Bus 名前空間に作成してこれらのイベントをリッスンし、レシーバーの開始によってイベントに対応できます。 この機能により、Service Bus はリアクティブ プログラミング モデルで使用できます。 この機能の重要なシナリオは、メッセージが少量の Service Bus キューまたはサブスクリプションで、メッセージのレシーバー ポーリングを常時行う必要がなくなるというものです。
この機能を有効にするために必要な事柄を次に示します。
- 1 つ以上の Service Bus キューが含まれた Service Bus Premium 名前空間、または 1 つ以上のサブスクリプションがある Service Bus トピックが含まれた Service Bus Premium 名前空間。
- Service Bus 名前空間への共同作成者アクセス。 Azure portal で Service Bus 名前空間に移動して、 [アクセス制御 (IAM)] を選択し、 [ロールの割り当て] タブを選択します。名前空間への共同作成者アクセス権を持っていることを確認します。
- さらに、Service Bus 名前空間の Event Grid サブスクリプションが必要です。 このサブスクリプションは、取得すべきメッセージがあるという通知を Event Grid から受け取ります。 典型的なサブスクライバーとしては、Web アプリに情報を渡す webhook、Azure Functions、Azure App Service の Logic Apps 機能が考えられます。 その後サブスクライバーによって、メッセージが処理されます。
使用可能なイベントの種類
Service Bus から出力されるイベントの種類は次のとおりです。
イベントの種類 | 説明 |
---|---|
Microsoft.ServiceBus.ActiveMessagesAvailableWithNoListeners |
キューまたはサブスクリプションに新しいアクティブなメッセージが到着し、リッスンしているレシーバーがない場合に生成されます。 |
Microsoft.ServiceBus.DeadletterMessagesAvailableWithNoListeners |
配信不能キューに新しいアクティブなメッセージが到着し、アクティブなリスナーがない場合に生成されます。 |
Microsoft.ServiceBus.ActiveMessagesAvailablePeriodicNotifications |
キューまたはサブスクリプションにアクティブなメッセージがある場合に、その特定のキューまたはサブスクリプションにアクティブなリスナーが存在する場合でも、30 秒間隔で生成されます。 また、キューやサブスクリプションのアクティブなメッセージ数が 0 から正の値に遷移したときにも発生します。 |
Microsoft.ServiceBus.DeadletterMessagesAvailablePeriodicNotifications |
キューまたはサブスクリプションの配信不能エンティティにメッセージがある場合に、その特定のキューまたはサブスクリプションの配信不能エンティティにアクティブなリスナーが存在する場合でも、30 秒間隔で生成されます。 また、キューやサブスクリプションの配信不能エンティティの配信不能メッセージ カウントが 0 から正の値に遷移したときにも発生します。 |
イベントの例
アクティブなメッセージが利用可能 (リスナーなしの場合)
このイベントは、キューまたはサブスクリプションにアクティブなメッセージがあり、リッスンしているレシーバーがない場合に生成されます。
[{
"topic": "/subscriptions/{subscription-id}/resourcegroups/{your-rg}/providers/Microsoft.ServiceBus/namespaces/{your-service-bus-namespace}",
"subject": "topics/{your-service-bus-topic}/subscriptions/{your-service-bus-subscription}",
"eventType": "Microsoft.ServiceBus.ActiveMessagesAvailableWithNoListeners",
"eventTime": "2018-02-14T05:12:53.4133526Z",
"id": "dede87b0-3656-419c-acaf-70c95ddc60f5",
"data": {
"namespaceName": "YOUR SERVICE BUS NAMESPACE WILL SHOW HERE",
"requestUri": "https://{your-service-bus-namespace}.servicebus.windows.net/{your-topic}/subscriptions/{your-service-bus-subscription}/messages/head",
"entityType": "subscriber",
"queueName": "QUEUE NAME IF QUEUE",
"topicName": "TOPIC NAME IF TOPIC",
"subscriptionName": "SUBSCRIPTION NAME"
},
"dataVersion": "1",
"metadataVersion": "1"
}]
配信不能なメッセージが利用可能 (リスナーなしの場合)
配信不能キュー イベントのスキーマも同様です。 メッセージがあり、アクティブなレシーバーがいない配信不能キューごとに少なくとも 1 つのイベントを受信します。
[{
"topic": "/subscriptions/{subscription-id}/resourcegroups/{your-rg}/providers/Microsoft.ServiceBus/namespaces/{your-service-bus-namespace}",
"subject": "topics/{your-service-bus-topic}/subscriptions/{your-service-bus-subscription}",
"eventType": "Microsoft.ServiceBus.DeadletterMessagesAvailableWithNoListeners",
"eventTime": "2018-02-14T05:12:53.4133526Z",
"id": "dede87b0-3656-419c-acaf-70c95ddc60f5",
"data": {
"namespaceName": "YOUR SERVICE BUS NAMESPACE WILL SHOW HERE",
"requestUri": "https://{your-service-bus-namespace}.servicebus.windows.net/{your-topic}/subscriptions/{your-service-bus-subscription}/$deadletterqueue/messages/head",
"entityType": "subscriber",
"queueName": "QUEUE NAME IF QUEUE",
"topicName": "TOPIC NAME IF TOPIC",
"subscriptionName": "SUBSCRIPTION NAME"
},
"dataVersion": "1",
"metadataVersion": "1"
}]
アクティブなメッセージが利用可能な定期的な通知
このイベントは、特定のキューまたはサブスクリプションにアクティブなメッセージがある場合に、その特定のキューまたはサブスクリプションにアクティブなリスナーが存在する場合でも、定期的に生成されます。
[{
"topic": "/subscriptions/<subscription id>/resourcegroups/DemoGroup/providers/Microsoft.ServiceBus/namespaces/<YOUR SERVICE BUS NAMESPACE WILL SHOW HERE>",
"subject": "topics/<service bus topic>/subscriptions/<service bus subscription>",
"eventType": "Microsoft.ServiceBus.ActiveMessagesAvailablePeriodicNotifications",
"eventTime": "2018-02-14T05:12:53.4133526Z",
"id": "dede87b0-3656-419c-acaf-70c95ddc60f5",
"data": {
"namespaceName": "YOUR SERVICE BUS NAMESPACE WILL SHOW HERE",
"requestUri": "https://YOUR-SERVICE-BUS-NAMESPACE-WILL-SHOW-HERE.servicebus.windows.net/TOPIC-NAME/subscriptions/SUBSCRIPTIONNAME/$deadletterqueue/messages/head",
"entityType": "subscriber",
"queueName": "QUEUE NAME IF QUEUE",
"topicName": "TOPIC NAME IF TOPIC",
"subscriptionName": "SUBSCRIPTION NAME"
},
"dataVersion": "1",
"metadataVersion": "1"
}]
配信不能なメッセージが利用可能な定期的な通知
このイベントは、特定のキューまたはサブスクリプションに配信不能なメッセージがある場合に、その特定のキューまたはサブスクリプションの配信不能なエンティティにアクティブなリスナーが存在する場合でも、定期的に生成されます。
[{
"topic": "/subscriptions/<subscription id>/resourcegroups/DemoGroup/providers/Microsoft.ServiceBus/namespaces/<YOUR SERVICE BUS NAMESPACE WILL SHOW HERE>",
"subject": "topics/<service bus topic>/subscriptions/<service bus subscription>",
"eventType": "Microsoft.ServiceBus.DeadletterMessagesAvailablePeriodicNotifications",
"eventTime": "2018-02-14T05:12:53.4133526Z",
"id": "dede87b0-3656-419c-acaf-70c95ddc60f5",
"data": {
"namespaceName": "YOUR SERVICE BUS NAMESPACE WILL SHOW HERE",
"requestUri": "https://YOUR-SERVICE-BUS-NAMESPACE-WILL-SHOW-HERE.servicebus.windows.net/TOPIC-NAME/subscriptions/SUBSCRIPTIONNAME/$deadletterqueue/messages/head",
"entityType": "subscriber",
"queueName": "QUEUE NAME IF QUEUE",
"topicName": "TOPIC NAME IF TOPIC",
"subscriptionName": "SUBSCRIPTION NAME"
},
"dataVersion": "1",
"metadataVersion": "1"
}]
イベントのプロパティ
イベントのトップレベルのデータを次に示します。
プロパティ | Type | 説明 |
---|---|---|
topic |
string | イベント ソースの完全なリソース パス。 このフィールドは書き込み可能ではありません。 この値は Event Grid によって指定されます。 |
subject |
string | 発行元が定義したイベントの対象のパス。 |
eventType |
string | このイベント ソース用に登録されたイベントの種類のいずれか。 |
eventTime |
string | プロバイダーの UTC 時刻に基づくイベントの生成時刻。 |
id |
string | イベントの一意識別子。 |
data |
object | Blob Storage イベントのデータ。 |
dataVersion |
string | データ オブジェクトのスキーマ バージョン。 スキーマ バージョンは発行元によって定義されます。 |
metadataVersion |
string | イベント メタデータのスキーマ バージョン。 最上位プロパティのスキーマは Event Grid によって定義されます。 この値は Event Grid によって指定されます。 |
データ オブジェクトには、次のプロパティがあります。
プロパティ | Type | 説明 |
---|---|---|
namespaceName |
string | リソースが存在する Service Bus 名前空間。 |
requestUri |
string | イベントを生成している特定のキューまたはサブスクリプションの URI。 |
entityType |
string | イベントを生成している Service Bus エンティティの種類 (キューまたはサブスクリプション)。 |
queueName |
string | キューをサブスクライブしている場合、アクティブなメッセージのあるキュー。 トピック/サブスクリプションを使っている場合は値 null。 |
topicName |
string | アクティブなメッセージのある Service Bus サブスクリプションが属しているトピック。 キューを使っている場合は値 null。 |
subscriptionName |
string | アクティブなメッセージのある Service Bus サブスクリプション。 キューを使っている場合は値 null。 |
Service Bus 名前空間の Event Grid サブスクリプション
Service Bus 名前空間の Event Grid サブスクリプションは、次の 3 とおりの方法で作成できます。
- Azure portal。 次のチュートリアルを参照して、Azure portal を使用して、ハンドラーとして Azure Logic Apps と Azure Functions を使用して Service Bus イベントの Event Grid サブスクリプションを作成する方法を確認してください。
Azure CLI。 次の CLI の例は、Service Bus 名前空間によって作成されたシステム トピックの Azure Functions サブスクリプションを作成する方法を示しています。
namespaceid=$(az resource show --namespace Microsoft.ServiceBus --resource-type namespaces --name "<service bus namespace>" --resource-group "<resource group that contains the service bus namespace>" --query id --output tsv az eventgrid event-subscription create --resource-id $namespaceid --name "<YOUR EVENT GRID SUBSCRIPTION NAME>" --endpoint "<your_endpoint_url>" --subject-ends-with "<YOUR SERVICE BUS SUBSCRIPTION NAME>"
- PowerShell。 次に例を示します。
$namespaceID = (Get-AzServiceBusNamespace -ResourceGroupName "<YOUR RESOURCE GROUP NAME>" -NamespaceName "<YOUR NAMESPACE NAME>").Id New-AzEVentGridSubscription -EventSubscriptionName "<YOUR EVENT GRID SUBSCRIPTION NAME>" -ResourceId $namespaceID -Endpoint "<YOUR ENDPOINT URL>” -SubjectEndsWith "<YOUR SERVICE BUS SUBSCRIPTION NAME>"
発行されるイベントの数とイベントが発行される頻度
名前空間に複数のキューおよびトピック/サブスクリプションがある場合、キューごとおよびサブスクリプションごとに少なくとも 1 つのイベントを受信します。 イベントは、Service Bus エンティティにメッセージがなく新しいメッセージが届いた場合にすぐに発行されます。 または、アクティブなレシーバーを Service Bus が検出するまで 2 分おきに発行されます。 メッセージの読み取りによってイベントは中断されません。
既定の Service Bus では、名前空間内のすべてのエンティティについてイベントが発行されます。 特定のエンティティについてのみイベントを取得したい場合、次のセクションを参照してください。
イベントの取得元をフィルターを使って制限する
たとえば、名前空間内の 1 つのキューまたはサブスクリプションからのみイベントを取得したい場合、Event Grid によって提供される "先頭" フィルターまたは "末尾" フィルターを使用できます。 一部のインターフェイスでは、これらのフィルターは "プレ" フィルターおよび "サフィックス" フィルターと呼ばれます。 複数のキューとサブスクリプションについてイベントを取得したい場合、複数の Event Grid サブスクリプションを作成し、それぞれにフィルターを適用できます。
次のステップ
次のチュートリアルを参照してください。