在这篇博文中,我将演示如何利用 API 管理 (APIM) 中新发布的 GenAI 网关功能,使用断路器和负载平衡模式增强 Azure OpenAI 部署的弹性和容量。
背景
之前,我曾分享过使用不同路由算法(权重/优先级)在多个 OpenAI 端点之间平衡流量以提高弹性和性能的各种方法。然而,这些自定义解决方案在流量极高的情况下往往会失败。
由于我已经在之前的博客文章中讨论了与 OpenAI TPM 和 APIM 模式相关的挑战,因此这篇文章将直接关注解决方案。
OpenAI APIM 中的负载平衡功能
该解决方案包括两个主要配置部分:负载平衡和断路器。这些配置可以通过两种方法管理:APIM 门户 (UI) 和 Bicep (基础设施即代码)。
通过门户 (UI) 配置 APIM
-
支持负载平衡技术:最近在上一届 Microsoft Build 活动上宣布,APIM 现在支持加权和基于优先级的负载平衡技术。
-
创建后端资源:首先在 APIM 中为每个 OpenAI 端点创建后端资源。例如,您可以添加来自不同区域的两个 OpenAI 端点。
- 导入新 API:使用 OpenAI 服务模板导入新 API。选择 OpenAI 端点和基本 URL 后缀以形成 APIM URI 路径,例如https://myapim.azure-api.net/(basesuffix)。
-
在 API 管理中将每个 Az OpenAI 端点添加为后端资源,
通过 Bicep 配置 LB 和断路器
由于目前缺乏对负载均衡器或断路器配置的 UI 支持,因此必须通过 Bicep(基础设施即代码)来完成这些操作。
负载均衡器配置:
-
定义负载均衡器方法:您可以将负载均衡器配置为使用权重或优先级,或两者兼而有之。在此演示中,我们将使用基于权重的负载平衡,其中一个端点的权重将高于另一个端点。
-
代码片段调整:修改 APIM 及其后端池的名称,指定上一步中创建的后端池。此示例使用两个池,但您可以根据需要添加更多池。
复制复制resource symbolicname 'Microsoft.ApiManagement/service/backends@2023-09-01-preview' = { name: '(APIM-Name)/mybackendpool' properties: { description: 'Load balancer for multiple backends' type: 'Pool' pool: { services: [ { id: '/subscriptions/(subscripitonid)/resourceGroups/DefaultResourceGroup-SUK/providers/Microsoft.ApiManagement/service/opai-apim/backends/backend1-openai-endpoint' priority: 1 weight: 1 } { id: '/subscriptions/(subscripitonid)/resourceGroups/DefaultResourceGroup-SUK/providers/Microsoft.ApiManagement/service/opai-apim/backends/backend2-openai-endpoint' priority: 1 weight: 10 } ] } } }
-
部署 Bicep 模板:部署此 Bicep 模板并查找后端池中的变化,以确保其部署成功。
-
使用新后端名称更新 API:部署后,您将在 APIM 后端中看到新的后端名称。复制该名称并将其替换为您在初始步骤中创建的 API。
复制复制az deployment group create --resource-group Rresource-group-name --template-file apim.bicep
-
断路器配置:
-
健康探测设置:为每个后端池资源部署断路器条件,包括“故障条件”和“后重试”期限。
-
失败条件:定义特定持续时间内观察到的错误数量(例如,1 分钟内出现 5 个错误),并指定被视为错误的 HTTPS 错误代码范围。
-
重试时间:指定 APIM 可以在失败的后端池端点上重试运行状况探测的时间。在此配置中,错误代码范围为 400-599,每个后端池的持续时间为 1 分钟。
-
resource openaiprodbackend 'Microsoft.ApiManagement/service/backends@2023-09-01-preview' = {
name: 'APIM-name/nameofbackendpool'
properties: {
url: 'https://openaiendpointname.openai.azure.com/openai'
protocol: 'http'
circuitBreaker: {
rules: [
{
failureCondition: {
count: 1
errorReasons: [
'Server errors'
]
interval: 'PT1M'
statusCodeRanges: [
{
min: 400
max: 599
}
]
}
name: 'myBreakerRulePTU'
tripDuration: 'PT1M'
acceptRetryAfter: true
}
]
}
description: 'OpenAI PTU'
title: 'openai-PTU'
}
}
-
通过 API 验证
由于没有 UI 来验证断路器配置,请使用 APIM 后端 REST API 来确认更改。使用 Postman 或参阅 APIM 文档以获取验证工具。在 中指定后端名称,
backendID
在 中指定 APIM 名称serviceName
。 -
Bicep 配置现已完成,接下来是测试 LB 和断路器策略的实际作用
验证/测试 www.cqzlsb.com
要测试具有负载平衡的断路器:
-
引发错误:确保 OpenAI 端点抛出 400-599 范围内的错误。对权重/优先级中首选的 OpenAI 端点执行压力测试,这应该会导致 HTTP 429 错误(“服务器正忙”)。
-
测试 APIM 响应:一旦首选端点无响应,通过 APIM 调用 OpenAI 并验证是否从第二个端点收到响应。
-
示例:对美国东部的 OpenAI 端点执行压力测试,结果为 429 错误状态。通过对美国东部 OpenAI 端点的临时调用进行验证,以确认其失败并出现 429。同时,对 APIM 的 POST 请求应该可以正常工作,因为它由辅助后端(即英国南部的 OpenAI 端点)处理。
-
后端端点 2:后端端点 2 的权重较高,位于美国东部。使用 Postman 对此端点执行压力测试。
-
压力测试结果:对美国东部的 OpenAI 端点进行压力测试应该导致 429 错误状态。
临时呼叫验证:通过临时呼叫 EastUS OpenAI 端点进行验证,以确认它是否因 429 错误而失败。
一旦首选端点无响应,就通过 APIM 调用 OpenAI 并验证是否从第二个端点收到响应。
在此对 APIM 的 POST 请求应该可以正常工作,因为它由辅助后端(即 UKSouth 中的 OpenAI 端点)处理。
结论:
总之,使用 API 管理中的新 GenAI 网关功能可以大大提高 Azure OpenAI 服务的可靠性和性能。通过设置智能流量路由和安全措施,我们可以确保您的服务即使在高负载下也能保持响应。这种方法有助于平衡工作负载,并在出现问题时快速重定向流量,确保您的用户获得流畅可靠的体验。