首页 文章

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

提问于
浏览
1

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

场景:

  • 我创建了一个具有自动缩放 OFF 的实例组 ig .

  • 我创建了一个负载均衡器 lb1 ,详细信息如下:

  • lb1 包含一个后端服务 bs1 ,它指向实例组 ig ,并且 whole group 的最大RPS设置为1000 .

  • 前端端口:8080

  • 路径规则:/ alpha / *

  • lb1 是外部负载均衡器

  • 我创建了一个负载均衡器 lb2 ,详细信息如下:

  • lb2 包含一个后端服务 bs2 ,它指向实例组 ig ,并且 whole group 的最大RPS设置为2000 .

  • 前端端口:9090

  • 路径规则:/ beta / *

  • lb2 是区域负载均衡器

我有的问题:

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

  • 哪个限制将被授予1000或2000?

  • 整体请求(即通过 lb1lb2 )是否会受到速率限制,或者是否会对请求流应用个别限制?

1 回答

  • 3

    TL; DR - The RPS is set in the Backend Service,因此每个负载均衡器都有自己的 RPS 限制,与另一个无关 .

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

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

    • 哪个限制将被授予1000或2000?

    相对于第一负载 balancer 器1000和相对于第二负载 balancer 器2000和1000 . 请记住,您分别为 lb1lb2 使用了2个单独的后端服务 bs1bs2 .

    • 整体请求(即通过lb1和lb2)是否会受到速率限制,或者是否会对请求流应用个别限制?

    通过 lb1 for bs1 的请求将符合每个后端VM的最大 1000 RPS . 通过 lb2 for bs2 的请求将符合每个后端VM的最大 2000 RPS . 因此,在任何给定的后端VM实例中运行的服务应该至少能够处理 3000 RPS .

    更长的版本

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

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

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

    负载分配算法HTTP(S)负载均衡提供了两种确定实例负载的方法 . 在后端服务对象中,balancingMode属性在每秒请求数(RPS)和CPU利用率模式之间进行选择 . 两种模式都允许指定最大值; HTTP负载均衡器将尝试确保负载保持在限制之下,但在故障转移或加载峰值事件期间可能会发生超出限制的短突发 . 如果该区域具有可用容量,则将传入请求发送到最靠近用户的区域 . 如果在一个区域中为多个区域配置了后端,则根据每个组的容量,流量将分布在每个区域中的实例组中 . 在区域内,使用循环算法将请求均匀地分布在实例上 . 可以通过配置会话关联来覆盖循环分发 .

    maxRate和maxRatePerInstance

    在后端服务中,有2 configuration fields related to RPS,一个是 maxRate ,另一个是 maxRatePerInstance . maxRate 可用于设置每组 RPS ,而 maxRatePerInstance 可用于设置每个实例的 RPS . 看起来两者都可以在需要时结合使用 .

    backends [] .maxRate integer组的每秒最大请求数(RPS) . 可以与RATE或UTILIZATION balancer 模式一起使用,但如果是RATE模式则需要 . 对于RATE模式,必须设置maxRate或maxRatePerInstance . 这不能用于内部负载均衡 . backends [] .maxRatePerInstance float单个后端实例可以处理的每秒最大请求数(RPS) . 这用于计算组的容量 . 可以在任何 balancer 模式下使用 . 对于RATE模式,必须设置maxRate或maxRatePerInstance . 这不能用于内部负载 balancer .

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

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

    failed_to_pick_backend负载均衡器未能选择 Health 的后端来处理请求 . 502

    你可以通过设置一个相当低的 RPS (如 1020 )看看会发生什么 . 查看在后端接收请求的时间戳,以确定行为 . 此外,限制可能不会恰好发生在第11或第21个请求上,因此请尝试发送远远超过每秒的数据以验证请求是否被丢弃 .

    使用自动缩放

    如果启用自动缩放,则会自动触发自动缩放器,并根据您在自动缩放器中设置的目标利用率级别扩展实例组中的实例数 .

    NOTE: 更新了答案,因为您实际上已指定使用2个单独的后端服务 .

相关问题