你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 KEDA 缩放程序缩放 Dapr 应用程序

如果没有传入的 HTTP 流量,Azure 容器应用会自动将应用程序缩放为零。 但是,还可以对具有非 HTTP 流量的应用使用其他缩放触发器。 例如,使用 分布式应用程序运行时(Dapr) 发布-订阅(pub/sub)及绑定构建基块 API 的应用可以从事件驱动的缩放中受益。 在这些场景中,可以使用 Kubernetes 事件驱动自动缩放(KEDA)缩放器 根据挂起的入站事件和消息数量,动态地扩展或缩减应用程序及其 Dapr 边车容器。

本文介绍使用 KEDA 消息传送缩放程序的 Dapr pub/sub 应用程序的缩放规则。

示例发布/订阅应用程序

有关示例发布/子应用程序,请参阅以下 GitHub 存储库:

在前面的示例中,每个应用程序使用以下元素:

  • checkout发布者。 此容器应用旨在无限期运行。 它不会缩小到零,尽管从未收到任何传入的 HTTP 流量。
  • Dapr Azure 服务总线发布/订阅组件。
  • order-processor订阅者。 此容器应用程序从服务总线orders主题中接收并处理消息。

体系结构图显示消息流从带有 Dapr sidecar 的发布者流向服务总线,然后流向带有 Dapr sidecar 的订阅者。

本文讨论 Dapr 应用程序中服务总线的缩放规则。 当服务总线主题中的orders消息计数超过给定阈值时,规则指定order-processor服务及其 Dapr sidecar 横向扩展的条件。

发布服务器容器应用

发布 checkout 服务器是无限期运行的无外设服务,永远不会扩展到零。

默认情况下, 容器应用运行时将基于 HTTP 的缩放规则分配给应用程序,从而根据传入的 HTTP 请求数驱动缩放。 在以下示例中,minReplicas 设置为 1。 此设置将容器应用配置为在没有传入 HTTP 流量时不遵循缩放为零的默认行为。

resource checkout 'Microsoft.App/containerApps@2022-03-01' = {
  name: 'ca-checkout-${resourceToken}'
  location: location
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    //...
    template: {
      //...
      // Set the minimum number of replicas to 1.
      scale: {
        minReplicas: 1
        maxReplicas: 1
      }
    }
  }
}

订阅服务器容器应用

以下order-processor订阅者应用包括用于监视类型为azure-servicebus的资源的自定义缩放规则。 此规则定义了应用及其侧车根据服务总线中的挂起消息数量进行扩展和收缩的条件。 定义缩放规则时,KEDA 会在容器应用中自动运行。 无需安装 KEDA 或将其打开。

resource orders 'Microsoft.App/containerApps@2022-03-01' = {
  name: 'ca-orders-${resourceToken}'
  location: location
  tags: union(tags, {
      'azd-service-name': 'orders'
    })
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    managedEnvironmentId: containerAppsEnvironment.id
    configuration: {
      //...
      // Enable Dapr on the container app.
      dapr: {
        enabled: true
        appId: 'orders'
        appProtocol: 'http'
        appPort: 5001
      }
      //...
    }
    template: {
      //...
      // Set the scale property on the order-processor resource.
      scale: {
        minReplicas: 0
        maxReplicas: 10
        rules: [
          {
            name: 'topic-based-scaling'
            custom: {
              type: 'azure-servicebus'
              identity: 'system'
              metadata: {
                topicName: 'orders'
                subscriptionName: 'membership-orders'
                messageCount: '30'
              }
            }
          }
        ]
      }
    }
  }
}

缩放程序的工作原理

在订阅者应用程序中,scaler 配置包含一个 messageCount 属性:

{
  //...
  properties: {
    //...
    template: {
      //...
      scale: {
        //...
        rules: [
          //...
          custom: {
            //...
            metadata: {
              //...
              messageCount: '30'
            }
          }
        ]
      }
    }
  }
}

此属性指定应用程序每个实例可以同时处理的消息数。 在此示例中,该值设置为 30. 因此,缩放程序将为主题中等待的 30 条消息的每个组创建一个应用程序实例。 例如,如果 150 条消息正在等待,KEDA 会将应用横向扩展到 5 个实例。

maxReplicas 属性设置为 10。 即使主题中存在大量消息,缩放程序创建的此应用程序实例也不会超过 10 个。 此设置有助于确保不会横向扩展太多并累算过多成本。

后续步骤

由 Dapr 提供支持的微服务 API