当同一个实例组位于两个不同的负载均衡器后面时,速率限制将如何工作

Vik*_*rma 1 load-balancing rate-limiting autoscaling google-cloud-platform

我正在阅读有关 GCP 中的速率限制和自动缩放的内容,并被困在这个问题上:

设想:

  1. 我创建了一个ig具有 auto-scaling的实例组OFF
  2. 我创建了一个负载均衡器lb1,详细信息是:
    • lb1包含一个bs1指向实例组的后端服务, ig并且最大 RPS 设置为 1000 whole group
    • 前端端口:8080
    • 路径规则:/alpha/*
    • lb1 是一个外部负载均衡器
  3. 我又创建了一个负载均衡器lb2,详细信息是:
    • lb2包含bs2指向实例组 ig和最大 RPS 设置为 2000的后端服务whole group
    • 前端端口:9090
    • 路径规则:/beta/*
    • lb2 是一个区域负载均衡器

我的问题:

  • 谁将监控由两个负载均衡器提供的请求?
  • 哪个限制将兑现 1000 或 2000?
  • 整体请求(即通过lb1lb2)是否会受到速率限制,还是会对两个请求流应用单独的限制?

Tux*_*ude 6

TL;DR - RPS 设置在 中Backend Service,因此每个负载均衡器都有自己的RPS独立于另一个的限制。

  • 谁将监控由两个负载均衡器提供的请求?

Google Compute Engine (GCE) 将监控负载均衡器提供的请求,并相应地引导流量以保持在后端服务中每个后端的 RPS 限制内。

  • 哪个限制将兑现 1000 或 2000?

1000 相对于第一个负载平衡器和 2000 相对于第二个负载平衡器。请记住,你正在使用2个独立的后端服务bs1,并bs2lb1lb2分别。

  • 整体请求(即通过 lb1 和 lb2)是否会受到速率限制,还是会对两个请求流应用单独的限制?

请求经历lb1bs1将符合最高的1000 RPS每后端VM。请求经历lb2bs2将符合最高的2000 RPS每后端VM。因此,在任何给定后端 VM 实例中运行的服务应该至少能够处理3000 RPS.

更长的版本

实例组无法指定 RPS,只有后端服务可以。实例组仅有助于对实例列表进行分组。因此,虽然您可以在多个后端服务中使用相同的实例组,但RPS如果您的目标是在多个后端服务之间共享实例,则需要考虑您在相应后端服务中设置的值。GCE 将无法自动解决这个问题。

一个后端服务在理想情况下代表一个微服务,它由一组后端虚拟机(来自实例组)提供服务。您应该预先计算单个后端实例(即在 VM 内运行的服务)可以处理多少最大 RPS 以设置此限制。如果您打算跨后端服务共享 VM,则需要确保RPS最坏情况下的组合限制是您的 VM 内的服务能够处理的。

Google Compute Engine (GCE) 将监控每个后端服务的指标(即在您的情况下每秒请求数)并将其用于负载平衡。每个负载均衡器在逻辑上都是不同的,因此不会跨负载均衡器聚合(即使使用相同的实例组)。

负载分配算法

HTTP(S) 负载平衡提供了两种确定实例负载的方法。在后端服务对象中,balanceMode 属性在每秒请求数 (RPS) 和 CPU 使用模式之间进行选择。两种模式都允许指定最大值;HTTP 负载平衡器将尝试确保负载保持在限制以下,但在故障转移或负载尖峰事件期间可能会出现超过限制的短时间爆发

传入的请求将发送到离用户最近的区域,前提是该区域具有可用容量。如果一个区域中有多个可用区配置后端,则流量会根据每个可用区的容量分配到每个可用区的实例组中。在区域内,请求使用循环算法均匀分布在实例上。可以通过配置会话亲缘关系来覆盖循环分配。

maxRate 和 maxRatePerInstance

在后端服务中,与RPS相关的配置字段2个,一个是,一个maxRatemaxRatePerInstancemaxRate可用于设置RPS每个组,而maxRatePerInstance可用于设置RPS每个实例。如果需要,看起来两者可以结合使用。

后端[].maxRate

整数

组的最大每秒请求数 (RPS)。可以与RATEUTILIZATION平衡模式一起使用,但需要 ifRATE模式。对于RATE模式,必须设置maxRatemaxRatePerInstance

这不能用于内部负载平衡。

后端[].maxRatePerInstance

漂浮

每秒(RPS)max的请求,单一后端实例可以处理。这被用来计算该组的容量。可用于任一平衡模式。对于 RATE 模式,必须设置 maxRate 或 maxRatePerInstance。

这不能用于内部负载平衡。

以高于指定 RPS 的速率接收请求

如果您碰巧以高于 RPS 的速率接收请求并且禁用了自动缩放,我无法在 Google Cloud 网站上找到有关确切预期行为的任何文档。我能找到的最接近的是这个,它指定负载平衡器将尝试将每个实例保持在或低于指定的RPS. 因此,这可能意味着如果超过 ,则请求可能会被丢弃RPS,并且客户端可能会看到基于此的5XX错误代码之一(可能是502):

failed_to_pick_backend

负载均衡器未能选择一个健康的后端来处理请求。

502

您可以通过设置一个相当低的“ RPSlike”10或“20看看会发生什么”来解决这个问题。查看您在后端收到请求的时间戳以确定行为。此外,限制可能不会恰好发生在第 11 次或第 21 次请求,因此请尝试每秒发送远超过该值的次数以验证请求是否被丢弃。

使用自动缩放

但是,如果您启用自动缩放,这将自动触发自动缩放程序并使其根据您在自动缩放程序中设置的目标利用率级别扩展实例组中的实例数量。

注意:更新了答案,因为您实际上指定了您正在使用 2 个单独的后端服务。