自动更新Azure 服务总线命名空间的消息传送单元

自动缩放确保拥有适当数量的资源来应对应用程序的负载。 它增加了资源来处理负载的增加,并通过删除空闲的资源来节省资金。 若要详细了解Azure Monitor的自动缩放功能,请参阅 Azure 中的自动缩放视图。

服务总线高级消息传送在 CPU 和内存级别提供资源隔离,以便每个客户工作负荷以隔离方式运行。 此资源容器称为 消息传送单元。 若要了解有关消息传送单元的详细信息,请参阅 服务总线 Premium Messaging

通过使用服务总线高级命名空间的自动缩放功能,可以指定最小和最大数量的 messaging 单位并根据一组规则自动添加或删除消息传送单元。

例如,可以使用自动缩放功能为服务总线命名空间实现以下缩放方案:

  • 当 服务总线 命名空间的 CPU 使用率超过 75% 时,增加其消息传送单位。
  • 当命名空间的 CPU 使用率低于 25% 时,减少 服务总线 命名空间的消息单位。
  • 在工作时间使用更多的消息传送单元,在非工作时间使用更少。

本文介绍如何通过 Azure 门户和 Azure 资源管理器 模板自动调整 服务总线 命名空间的规模(更新 消息单元)。

重要

本文仅适用于Azure 服务总线的 premium 层。

扩展成本考虑

服务总线 高级层的计费单位按小时计费,根据每小时内分配的最高消息单位数计算。 在同一小时内再缩减规模,也不会减少该小时的费用。 因为你已经为峰值付费,大幅缩容并不能为当前这个小时节省任何费用,反而会让下一次流量高峰的可用余量更少。

在定义自动减量规则时,应优先考虑更长的缩放冷却时间,比如30分钟或更长,并且设定一个保守的缩减阈值。 命名空间会保留足够的容量用于峰值,且在较低负载稳定时仍会减少单位数量。 关于详细的规则设置,请参见 自定义自动调整——附加条件

使用 Azure 门户进行配置

本部分介绍如何使用Azure门户为服务总线命名空间配置消息传送单元的自动缩放。

“自动缩放设置”页

首先,按照以下步骤转到服务总线命名空间的 Autoscale 设置页。

  1. 登录到 Azure 门户

  2. 在搜索栏中,键入 服务总线,从列表中选择 服务总线,然后按 Enter

  3. 从命名空间列表中选择 高级命名空间

  4. 切换到 "缩放" 页。

    服务总线 命名空间 - 缩放页面

手动缩放

使用此设置可设置命名空间的固定消息传送单元数。

  1. “自动缩放设置 ”页上,选择“ 手动缩放 ”(如果尚未选择)。

  2. 对于 “消息传送单位 ”设置,请从列表中选择消息传送单元数。

  3. 在工具栏上选择 “保存” 以保存设置。

    手动调整消息传送单元

自定义自动缩放 - 默认条件

可以使用条件配置消息传送单元的自动缩放。 当其他任何缩放条件都不匹配时,此缩放条件将运行。 通过以下方式之一设置默认条件:

  • 根据指标(例如 CPU 或内存使用情况)进行缩放
  • 缩放到特定数量的消息传送单元

在默认条件下,无法将计划设置为在特定日期或日期范围内自动缩放。 当其他按计划执行的缩放条件不匹配时,此缩放条件将被运行。

重要

设置自动缩放时,内存和 CPU 都是关键资源。 为二者建立扩展和缩小规则。

注释

为了提高接收吞吐量,服务总线将某些消息保留在其缓存中。 仅当内存使用量超过特定的高阈值(例如 80%)时,服务总线才会剪裁缓存。 如果实体发送消息但未收到消息,则缓存的消息会反映在内存使用量增加中。 通常,这种情况无需担心,因为 服务总线 会在需要时修剪缓存,从而减少内存使用率。 但是,随着内存使用量的快速增加,请以 60% 内存使用量纵向扩展,以防止消息处理中断。

基于指标进行缩放

以下过程演示如何添加条件:当 CPU 使用率大于 75% 时,自动增加消息传送单元(横向扩展);当 CPU 使用率小于 25% 时,减少消息传送单元(缩小)。 增量按照顺序从 1 到 2、2 到 4、4 到 8 和 8 到 16 进行。 同样,减量从 16 到 8、8 到 4、4 到 2 和 2 到 1。

  1. “自动缩放”设置上,为“选择如何缩放资源”选项选择“自定义自动缩放”。

  2. 在页面的 “默认 ”部分中,输入默认条件 的名称 。 选择 铅笔 图标以编辑文本。

  3. 选择基于指标缩放缩放模式

  4. 选择 “+ 添加规则”。

    默认值 - 基于指标缩放

  5. “缩放”规则上,按照以下步骤操作:

    1. “指标名称 ”下拉列表中选择指标。 在此示例中,它是 CPU

    2. 选择运算符和阈值。 在此示例中,指标阈值为大于75用于触发缩放操作

    3. 操作部分选择操作。 在此示例中,它设置为 “增加”。

    4. 然后选择 添加

      默认 - 如果 CPU 使用率大于 75%,则横向扩展

      注释

      如果整体 CPU 使用率超过 75%,则自动缩放功能会增加命名空间的消息传送单元。 增量按照顺序从 1 到 2、2 到 4、4 到 8 和 8 到 16 进行。

  6. 再次选择 “+ 添加规则 ”,并在 “缩放”规则上执行以下步骤:

    1. “指标名称 ”下拉列表中选择指标。 在此示例中,它是 CPU

    2. 选择运算符和阈值。 在此示例中,小于25指标阈值将触发缩放操作。

    3. 操作部分选择操作。 在此示例中,它设置为 “减少”。

    4. 然后选择 添加

      默认值 - 如果 CPU 使用率小于 25%,则缩减

      注释

      如果整个 CPU 使用率低于此示例中的 25%,则自动缩放功能会减少命名空间的消息传送单元。 减量从 16 到 8、8 到 4、4 到 2 和 2 到 1。

  7. 添加基于内存的规则,使该命名空间能够根据 CPU 和内存 进行扩缩容。 再次选择+ 添加规则,为指标名称选择内存,将运算符和阈值设置为大于60,将操作设置为增加,然后选择添加。 由于内存使用可能迅速上升,将内存使用量扩展到60% 有助于防止消息处理中断。

  8. 设置消息传送单位 的最小最大值默认 数目。

    基于指标的默认规则

  9. 选择工具栏上的 “保存 ”以保存自动缩放设置。

缩放到特定数量的消息传送单元

按照以下步骤配置规则以缩放命名空间以使用特定数量的消息传送单元。 当其他任何缩放条件都不匹配时,则默认条件适用。

  1. “自动缩放”设置上,为“选择如何缩放资源”选项选择“自定义自动缩放”。

  2. 在页面的 “默认 ”部分中,输入默认条件 的名称

  3. 选择“缩放到特定消息传送单元”作为缩放模式

  4. 对于 消息传送单元,请选择默认消息传送单元的数量。

    默认值 - 缩放到特定消息传送单元

自定义自动缩放 - 附加条件

上一部分演示如何为自动缩放设置添加默认条件。 本部分介绍如何向自动缩放设置添加更多条件。 对于这些额外的非默认条件,可以根据一周的特定日期或日期范围设置计划。

基于指标进行缩放

  1. “自动缩放”设置上,为“选择如何缩放资源”选项选择“自定义自动缩放”。

  2. 选择“添加缩放条件”,该选项位于默认块下。

    自定义 - 添加缩放条件链接

  3. 输入条件 的名称

  4. 确认已选择基于指标的缩放选项。

  5. 选择 “+ 添加规则 ”以在总 CPU 使用率超过 75%时添加规则以增加消息传送单位。 按照 默认条件 部分中的步骤执行。

  6. 设置消息传送单位 的最小最大值默认 数目。

  7. 根据自定义条件(但不在默认条件上)设置 计划 。 可以指定条件的开始日期和结束日期,也可以选择一周的特定日期(星期一、星期二等)。

    1. 如果选择 “指定开始/结束日期”,请选择 时区开始日期和时间以及 结束日期和时间 (如下图所示),使条件生效。

      消息传送单位数的最小值、最大值和默认值

    2. 如果选择“ 重复特定日期”,请选择应应用条件的一周、时区、开始时间和结束时间。

      重复特定日期

缩放到特定数量的消息传送单元

  1. “自动缩放”设置上,为“选择如何缩放资源”选项选择“自定义自动缩放”。

  2. 选择“添加缩放条件”,该选项位于默认块下。

    自定义 - 添加缩放条件链接

  3. 输入条件 的名称

  4. 选择缩放模式中的缩放到特定消息单元选项。

  5. 从下拉列表中选择 消息传送单位 数。

  6. 对于 计划,请指定条件的开始日期和结束日期,或选择某一周中的特定日期(如星期一、星期二等)和时间。

    1. 如果选择 “指定开始/结束日期”,请选择 时区开始日期和时间,以及条件生效的 结束日期和时间

    缩放到特定的消息单元 - 开始日期和结束日期

    1. 如果选择“ 重复特定日期”,请选择应应用条件的一周、时区、开始时间和结束时间。

    缩放至特定消息单元 - 重复特定的天数

    若要详细了解自动缩放设置的工作原理,特别是如何选取配置文件或条件并评估多个规则,请参阅 “了解自动缩放设置”。

    注释

    • 用于决定自动缩放的指标可能已有 5-10 分钟之久。 处理峰值工作负载时,请将扩容操作设定为较短的持续时间,并将缩容操作设定为较长的持续时间。 将缩减的冷却时间保持 在30分钟以上 ,以确保减少的工作量稳定,然后再缩减。 此条件可确保有足够的消息传送单元来处理峰值工作负荷,并避免可能导致流量限制的过早缩减。

    纵向缩减时,将阈值设置为小于纵向扩展阈值的一半。 例如,如果扩展阈值为 75%,则将缩减阈值设置为 25%–35%(即低于 37% 的值),以防止持续反复扩展和缩减。 此设置可防止自动扩缩在向上扩展和向下缩减之间连续切换。

    • 如果由于容量不足(没有可用的消息单元)而出现故障,请提交支持请求。 容量实现受环境的约束,并在最大努力下进行。

运行历史记录

切换到“缩放”页上的“运行历史记录”选项卡,以查看绘制自动缩放引擎观察到的消息传送单元数的图表。 如果图表为空,则表示自动缩放未配置或已禁用,或者处于冷却期。

显示“缩放”页上的“运行历史记录”的屏幕截图。

Notifications

切换到“缩放”页上的“通知”选项卡,以便:

  • 允许向管理员、共同管理员和任何其他管理员发送通知电子邮件。

  • 启用向 webhooks 公开的 HTTP 或 HTTPS 接口发送通知电子邮件。

    显示“缩放”页的“通知”选项卡的屏幕截图。

使用资源管理器模板进行配置

可以使用以下示例资源管理器模板创建具有队列的服务总线命名空间,并配置命名空间的自动缩放设置。 在此示例中,指定了两个缩放条件。

  • 默认缩放条件:当平均 CPU 使用率超过 75% 时增加消息传送单位,并在平均 CPU 使用率低于 25%时减少消息传送单位。
  • 在周末将两个消息传送单元分配给命名空间。

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": "China East",
			"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": "China East"
			}
		}
	]
}

还可以从 Azure 门户为自动缩放设置资源生成 JSON 示例。 在 Azure 门户中配置自动缩放设置后,在 Scale 页上的命令栏上选择 JSON

图像显示在 Azure 门户的缩放页面命令栏上选择 JSON 按钮。

然后,在资源管理器模板的 resources 节中包含 JSON,如前面的示例所示。

其他注意事项

自定义自动缩放 选项与 默认 条件或配置文件一起使用时,消息传送单位数会逐渐增加(1、2、4、8、16)或减少(16、8、4、2、1)。

创建其他条件时,消息传送单元数可能不会逐渐增加或减少。 假设您定义了两个配置文件,如以下示例所示。 在 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]
				}
			}
		}
	]
}

创建逐渐增加或减少消息传送单位数的规则。

后续步骤

若要了解消息传送单元,请参阅 高级消息传送