Azure Service Bus 名前空間のメッセージング ユニットを自動的に更新する

自動スケールを使用すると、適切な量のリソースを実行して、アプリケーションに対する負荷を処理することができます。 リソースを追加して負荷の増加に対処したり、アイドル状態のリソースを削除して経費を節約したりできます。 Azure Monitor の自動スケーリング機能の詳細については、「Microsoft Azure の自動スケーリングの概要」を参照してください。

Service Bus Premium メッセージングでは、各顧客のワークロードが分離した状態で実行されるように、CPU とメモリのレベルでリソースが分離されます。 このリソースのコンテナーを、メッセージング ユニットと呼びます。 メッセージング ユニットの詳細については、Service Bus Premium メッセージングに関するページを参照してください。

Service Bus Premium 名前空間の自動スケーリング機能を使用して、メッセージング ユニットの最小および最大数を指定し、一連のルールに基づいてメッセージング ユニットを自動的に追加または削除することができます。

たとえば、自動スケーリング機能を使用して、Service Bus 名前空間の次のスケーリング シナリオを実装できます。

  • 名前空間の CPU 使用率が 75% を超えたときに Service Bus 名前空間のメッセージング ユニットを増やします。
  • 名前空間の CPU 使用率が 25% 未満になったときに Service Bus 名前空間のメッセージング ユニットを減らします。
  • 営業時間中により多くのメッセージング ユニットを使用し、業務時間外は少なくします。

この記事では、Azure portal と Azure Resource Manager テンプレートを使用して、Service Bus 名前空間を自動的にスケーリングする (メッセージング ユニットを更新する) 方法について説明します。

重要

この記事は、Azure Service Bus の Premium レベルのみを対象としています。

Azure portal を使用して構成する

このセクションでは、Azure portal を使用して、Service Bus 名前空間のメッセージング ユニットの自動スケーリングを構成する方法について説明します。

自動スケーリング設定ページ

まず、次の手順に従って、Service Bus 名前空間の [Autoscale settings](自動スケーリング設定) ページに移動します。

  1. Azure portal にサインインします。

  2. 検索バーに「Service Bus」と入力し、ドロップダウン リストから [Service Bus] を選択して、ENTER キーを押します。

  3. 名前空間の一覧から Premium 名前空間を選択します。

  4. [Scale](スケール) ページに移動します。

    Service Bus 名前空間 - [Scale]\(スケール\) ページ

手動でのスケーリング

この設定を使用すると、名前空間に固定された数のメッセージング ユニットを設定できます。

  1. [Autoscale setting](自動スケーリング設定) ページで、 [Manual scale](手動スケール) を選択します (まだ選択されていない場合)。

  2. [Messaging units](メッセージング ユニット) 設定で、ドロップダウン リストからメッセージ ユニット数を選択します。

  3. ツール バーの [保存] を選択して設定を保存します。

    メッセージング ユニットの手動スケール

カスタム自動スケーリング - 既定の条件

メッセージング ユニットの自動スケーリングは、条件を使用して構成できます。 このスケーリング条件は、その他のスケーリング条件のいずれも一致しないときに実行されます。 既定の条件は、次のいずれかの方法で設定できます。

  • メトリック (CPU やメモリ使用量など) に基づいてスケーリングする
  • メッセージング ユニットの特定の数に合わせてスケーリングする

既定の条件について、特定の曜日または日付範囲に自動スケーリングするようスケジュールを設定することはできません。 このスケーリング条件は、スケジュールが設定されているその他のスケーリング条件のいずれも一致しないときに実行されます。

注意

受信スループットを向上させるために、Service Bus は一部のメッセージをキャッシュに保持します。 Service Bus は、メモリ使用量が特定の高いしきい値 (90% など) を超えた場合にのみキャッシュをトリミングします。 そのため、エンティティがメッセージを送信しているものの受信はしていない場合、それらのメッセージはキャッシュされ、メモリ使用量の増加に反映されます。 Service Bus は必要に応じてキャッシュをトリミングするため、懸念するには及びません。トリミングにより、最終的にメモリ使用量は低下します。 名前空間にパフォーマンスやその他の問題がない限り、メモリは問題を引き起こしません。 Service Bus での自動スケーリングには、CPU 使用率をメトリックに使用することをお勧めします。

メトリックに基づいてスケーリングする

次の手順では、CPU 使用率が 75% を超えた場合にメッセージング ユニットを自動的に増加させ (スケールアウト)、CPU 使用率が 25% 未満の場合にメッセージング ユニットを減少させる (スケールイン) 条件を追加する方法を示します。 増分は、1 から 2、2 から 4、4 から 8、および 8 から 16 になるように行われます。 同様に、減分は 16 から 8、8 から 4、4 から 2、および 2 から 1 になるように行われます。

  1. [Autoscale setting](自動スケーリング設定) ページで、 [Choose how to scale your resource](リソースをスケールする方法を選択します) オプションに [Custom auto scale](カスタム自動スケーリング) を選択します。

  2. ページの [Default](既定) セクションで、既定の条件として [名前] を指定します。 鉛筆アイコンをクリックしてテキストを編集します。

  3. [スケール モード] には、 [メトリックに基づいてスケーリングする] を選択します。

  4. [+ ルールの追加] を選択します。

    既定 - メトリックに基づいてスケーリングする

  5. [スケール ルール] ページで、次の手順を行います。

    1. [メトリック名] ドロップダウン リストからメトリックを選択します。 この例では [CPU] です。

    2. 演算子としきい値を選択します。 この例では、これらは [より大きい] および [Metric threshold to trigger scale action](スケール操作をトリガーするメトリックのしきい値)[75] です。

    3. [アクション] セクションで操作を選択します。 この例では、 [Increase](増加) に設定されています。

    4. 次に、 [Add](追加) を選択します

      既定 - CPU 使用率が 75% を超えた場合にスケールアウト

      注意

      この例では、全体的な CPU 使用率が 75% を超えた場合、自動スケーリング機能によって名前空間のメッセージング ユニットが増加します。 増分は、1 から 2、2 から 4、4 から 8、および 8 から 16 になるように行われます。

  6. [+ Add a rule](+ ルールの追加) を再度選択し、 [スケール ルール] ページで次の手順を実行します。

    1. [メトリック名] ドロップダウン リストからメトリックを選択します。 この例では [CPU] です。

    2. 演算子としきい値を選択します。 この例では、これらは [より小さい] および [Metric threshold to trigger scale action](スケール操作をトリガーするメトリックのしきい値)[25] です。

    3. [アクション] セクションで操作を選択します。 この例では、 [Decrease](減少) に設定されています。

    4. 次に、 [Add](追加) を選択します

      既定 - CPU 使用率が 25% 未満の場合にスケールイン

      注意

      この例では、全体的な CPU 使用率が 25% 未満の場合、自動スケーリング機能によって名前空間のメッセージング ユニットが減少します。 減分は、16 から 8、8 から 4、4 から 2、および 2 から 1 になるように行われます。

  7. [minimum](最小)[maximum](最大)[default](既定) のメッセージング ユニット数を設定します。

    メトリックに基づく既定のルール

  8. ツール バーの [保存] を選択して自動スケーリング設定を保存します。

メッセージング ユニットの特定の数に合わせてスケーリングする

特定の数のメッセージング ユニットを使用するように名前空間をスケーリングするルールを構成するには、次の手順に従います。 ここでも、既定の条件は、その他のスケーリング条件のいずれも一致しないときに適用されます。

  1. [Autoscale setting](自動スケーリング設定) ページで、 [Choose how to scale your resource](リソースをスケールする方法を選択します) オプションに [Custom auto scale](カスタム自動スケーリング) を選択します。

  2. ページの [Default](既定) セクションで、既定の条件として [名前] を指定します。

  3. [スケール モード] で、 [Scale to specific messaging units](特定のメッセージング ユニットに合わせてスケーリングする) を選択します。

  4. [メッセージング ユニット] については、既定のメッセージング ユニットの数を選択します。

    既定 - 特定のメッセージング ユニットに合わせてスケーリングする

カスタム自動スケーリング - 追加条件

前のセクションでは、自動スケーリング設定のための既定の条件を追加する方法について説明しました。 このセクションでは、自動スケーリング設定に条件を追加する方法について説明します。 これらの既定以外の追加条件では、特定の曜日または日付範囲に基づいてスケジュールを設定できます。

メトリックに基づいてスケーリングする

  1. [Autoscale setting](自動スケーリング設定) ページで、 [Choose how to scale your resource](リソースをスケールする方法を選択します) オプションに [Custom auto scale](カスタム自動スケーリング) を選択します。

  2. [Default](既定) ブロックの下で [Add a scale condition](スケーリング条件を追加する) を選択します。

    カスタム - [スケーリング条件を追加する] リンク

  3. 条件の名前を指定します。

  4. [メトリックに基づいてスケーリングする] オプションが選択されていることを確認します。

  5. [+ Add a rule](+ ルールの追加) を選択して、CPU の全体的な使用率が 75% を超えたときにメッセージング ユニットを増やすルールを追加します。 既定の条件に関するセクションの手順に従います。

  6. [minimum](最小)[maximum](最大)[default](既定) のメッセージング ユニット数を設定します。

  7. また、カスタム条件に対してスケジュールを設定することもできます (既定の条件は対象外)。 条件の開始日と終了日を指定するか、または週の特定の曜日 (月曜日、火曜日など) を選択することができます。

    1. [Specify start/end dates](開始日/終了日の指定) を選択した場合、条件が有効になる [タイムゾーン][Start date](開始日) と時刻[End date](終了日) と時刻を (以下のイメージに表示されているように) 選択します。

      メッセージング ユニットの数の最小値、最大値、既定値

    2. [Repeat specific days](特定の曜日に繰り返す) を選択した場合、条件を適用する曜日、タイムゾーン、開始時刻、終了時刻を選択します。

      特定の曜日に繰り返す

メッセージング ユニットの特定の数に合わせてスケーリングする

  1. [Autoscale setting](自動スケーリング設定) ページで、 [Choose how to scale your resource](リソースをスケールする方法を選択します) オプションに [Custom auto scale](カスタム自動スケーリング) を選択します。

  2. [Default](既定) ブロックの下で [Add a scale condition](スケーリング条件を追加する) を選択します。

    カスタム - [スケーリング条件を追加する] リンク

  3. 条件の名前を指定します。

  4. [スケール モード] で、 [Scale to specific messaging units](特定のメッセージング ユニットに合わせてスケーリングする) オプションを選択します。

  5. ドロップダウン リストからメッセージ ユニット数を選択します。

  6. スケジュールについては、条件の開始日と終了日を指定するか、または週の特定の曜日 (月曜日、火曜日など) および時刻を選択することができます。

    1. [Specify start/end dates](開始日/終了日の指定) を選択した場合、条件が有効になる [Timezone](タイムゾーン)[Start date](開始日) と時刻[End date](終了日) と時刻を選択します。

    特定のメッセージング ユニットに合わせてスケーリングする - 開始日および終了日

    1. [Repeat specific days](特定の曜日に繰り返す) を選択した場合、条件を適用する曜日、タイムゾーン、開始時刻、終了時刻を選択します。

    特定のメッセージング ユニットに合わせてスケーリングする - 特定の曜日に繰り返す

    自動スケーリング設定がどのように機能するか、特にプロファイルまたは条件を選択して複数のルールを評価する方法の詳細については、「自動スケーリング設定について」を参照してください。

    Note

    • 自動スケーリングに関する意思決定を行う際に確認するメトリックは、5 から 10 分前のものである可能性があります。 激しいワークロードを扱う場合、激しいワークロードを処理するために十分なメッセージング ユニットを確保するため、スケール アップの継続時間は短く、スケール ダウンの継続時間は長く (10 分より長く) 設定します。

    • それでも容量不足 (使用可能なメッセージング ユニットの不足) が原因でエラーが発生する場合は、サポート チケットを発行してください。

実行履歴

[スケール] ページの [実行履歴] タブに切り替えて、自動スケーリング エンジンによって観測されたメッセージング ユニットの数をプロットするグラフを表示します。 グラフが空の場合、自動スケーリングが構成されていない、構成されている一方で無効になっている、またはクールダウン期間であることを示します。

**スケール** ページの **実行履歴** を示すスクリーンショット。

通知

[スケール] ページの [通知] タブに切り替えます。このタブでは、以下を行うことができます。

  • 管理者、共同管理者、その他の管理者への通知メールの送信を有効にする。

  • Webhook によって公開される HTTP または HTTPS エンドポイントへの通知メールの送信を有効にする。

    **スケール** ページの **通知** タブを示すスクリーンショット。

Resource Manager テンプレートを使用した構成

次のサンプル Resource Manager テンプレートを使用すると、キューを含む Service Bus 名前空間を作成し、その名前空間の自動スケーリング設定を構成できます。 この例では、2 つのスケーリング条件が指定されています。

  • 既定のスケーリング条件: 平均 CPU 使用率が 75% を上回ったらメッセージング ユニットを増やし、平均 CPU 使用率が 25% を下回ったらメッセージング ユニットを減らす。
  • 週末に名前空間に 2 つのメッセージング ユニットを割り当てる。

Template

{
	"$schema": "https: //schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
	"contentVersion": "1.0.0.0",
	"parameters": {
		"serviceBusNamespaceName": {
			"type": "String",
			"metadata": {
				"description": "Name of the Service Bus namespace"
			}
		},
		"serviceBusQueueName": {
			"type": "String",
			"metadata": {
				"description": "Name of the Queue"
			}
		},
		"autoScaleSettingName": {
			"type": "String",
			"metadata": {
				"description": "Name of the auto scale setting."
			}
		},
		"location": {
			"defaultValue": "[resourceGroup().location]",
			"type": "String",
			"metadata": {
				"description": "Location for all resources."
			}
		}
	},
	"resources": [{
			"type": "Microsoft.ServiceBus/namespaces",
			"apiVersion": "2021-11-01",
			"name": "[parameters('serviceBusNamespaceName')]",
			"location": "[parameters('location')]",
			"sku": {
				"name": "Premium"
			},
			"properties": {}
		},
		{
			"type": "Microsoft.ServiceBus/namespaces/queues",
			"apiVersion": "2021-11-01",
			"name": "[format('{0}/{1}', parameters('serviceBusNamespaceName'), parameters('serviceBusQueueName'))]",
			"dependsOn": [
				"[resourceId('Microsoft.ServiceBus/namespaces', parameters('serviceBusNamespaceName'))]"
			],
			"properties": {
				"lockDuration": "PT5M",
				"maxSizeInMegabytes": 1024,
				"requiresDuplicateDetection": false,
				"requiresSession": false,
				"defaultMessageTimeToLive": "P10675199DT2H48M5.4775807S",
				"deadLetteringOnMessageExpiration": false,
				"duplicateDetectionHistoryTimeWindow": "PT10M",
				"maxDeliveryCount": 10,
				"autoDeleteOnIdle": "P10675199DT2H48M5.4775807S",
				"enablePartitioning": false,
				"enableExpress": false
			}
		},
		{
			"type": "Microsoft.Insights/autoscaleSettings",
			"apiVersion": "2021-05-01-preview",
			"name": "[parameters('autoScaleSettingName')]",
			"location": "East US",
			"dependsOn": [
				"[resourceId('Microsoft.ServiceBus/namespaces', parameters('serviceBusNamespaceName'))]"
			],
			"tags": {},
			"properties": {
				"name": "[parameters('autoScaleSettingName')]",
				"enabled": true,
				"predictiveAutoscalePolicy": {
					"scaleMode": "Disabled",
					"scaleLookAheadTime": null
				},
				"targetResourceUri": "[resourceId('Microsoft.ServiceBus/namespaces', parameters('serviceBusNamespaceName'))]",
				"profiles": [{
						"name": "Increase messaging units to 2 on weekends",
						"capacity": {
							"minimum": "2",
							"maximum": "2",
							"default": "2"
						},
						"rules": [],
						"recurrence": {
							"frequency": "Week",
							"schedule": {
								"timeZone": "Eastern Standard Time",
								"days": [
									"Saturday",
									"Sunday"
								],
								"hours": [
									6
								],
								"minutes": [
									0
								]
							}
						}
					},
					{
						"name": "{\"name\":\"Scale Out at 75% CPU and Scale In at 25% CPU\",\"for\":\"Increase messaging units to 4 on weekends\"}",
						"capacity": {
							"minimum": "1",
							"maximum": "8",
							"default": "2"
						},
						"rules": [{
								"scaleAction": {
									"direction": "Increase",
									"type": "ServiceAllowedNextValue",
									"value": "1",
									"cooldown": "PT5M"
								},
								"metricTrigger": {
									"metricName": "NamespaceCpuUsage",
									"metricNamespace": "microsoft.servicebus/namespaces",
									"metricResourceUri": "[resourceId('Microsoft.ServiceBus/namespaces', parameters('serviceBusNamespaceName'))]",
									"operator": "GreaterThan",
									"statistic": "Average",
									"threshold": 75,
									"timeAggregation": "Average",
									"timeGrain": "PT1M",
									"timeWindow": "PT10M",
									"Dimensions": [],
									"dividePerInstance": false
								}
							},
							{
								"scaleAction": {
									"direction": "Decrease",
									"type": "ServiceAllowedNextValue",
									"value": "1",
									"cooldown": "PT5M"
								},
								"metricTrigger": {
									"metricName": "NamespaceCpuUsage",
									"metricNamespace": "microsoft.servicebus/namespaces",
									"metricResourceUri": "[resourceId('Microsoft.ServiceBus/namespaces', parameters('serviceBusNamespaceName'))]",
									"operator": "LessThan",
									"statistic": "Average",
									"threshold": 25,
									"timeAggregation": "Average",
									"timeGrain": "PT1M",
									"timeWindow": "PT10M",
									"Dimensions": [],
									"dividePerInstance": false
								}
							}
						],
						"recurrence": {
							"frequency": "Week",
							"schedule": {
								"timeZone": "Eastern Standard Time",
								"days": [
									"Saturday",
									"Sunday"
								],
								"hours": [
									18
								],
								"minutes": [
									0
								]
							}
						}
					}
				],
				"notifications": [],
				"targetResourceLocation": "East US"
			}
		}
	]
}

Azure portal から、自動スケーリング設定リソースの JSON サンプルを生成することもできます。 Azure portal で自動スケーリング設定を構成した後、[スケール] ページのコマンド バーで [JSON] を選択します。

Azure portal の **スケール** ページのコマンド バーにある JSON ボタンの選択を示す画像。

次に、前の例で示されているように、Resource Manager テンプレートの resources セクションに JSON を組み込みます。

その他の注意点

既定の条件またはプロファイルで [カスタム自動スケーリング] オプションを使用すると、メッセージング ユニットが徐々に増加 (1 -> 2 -> 4 -> 8 -> 16) または減少 (16 -> 8 -> 4 -> 2 -> 1) します。

追加の条件を作成する場合、メッセージング ユニットが徐々に増減しないことがあります。 次の例に示すように、2 つのプロファイルが定義されているとします。 06:00 UTC にメッセージング ユニットが 16 に設定され、21:00 UTC に 1 に減っています。

{

	"Profiles": [
		{
			"Name": "standardProfile",
			"Capacity": {
				"Minimum": "16",
				"Maximum": "16",
				"Default": "16"
			},
			"Rules": [],
			"Recurrence": {
				"Frequency": "Week",
				"Schedule": {
					"TimeZone": "UTC",
					"Days": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"
					],
					"Hours": [6],
					"Minutes": [0]
				}
			}
		},
		{
			"Name": "outOfHoursProfile",
			"Capacity": {
				"Minimum": "1",
				"Maximum": "1",
				"Default": "1"
			},
			"Rules": [],
			"Recurrence": {
				"Frequency": "Week",
				"Schedule": {
					"TimeZone": "UTC",
					"Days": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
					"Hours": [21],
					"Minutes": [0]
				}
			}
		}
	]
}

メッセージング ユニットが徐々に増減するようにルールを作成することをお勧めします。

次のステップ

メッセージング ユニットの詳細については、Premium メッセージングに関するページを参照してください