如何正确地将 Java 客户端的请求负载均衡到跨多个可用区的 NLB

如何正确地将 Java 客户端的请求负载均衡到跨多个可用区的 NLB

Java 客户端通过多个可用区向 NLB 发送的请求未实现负载平衡

概括

期望:来自 Java 的每个请求都在两个节点之间进行负载平衡。

实际行为:所有请求仅发送到一个节点,而两个节点均可用。

为什么会出现这种情况?在这种情况下,实现负载平衡的最佳策略是什么?

细节

我有一个如下图所示的网络。 图像:一个 NLB 位于两个 AZ 上。每个 AZ 都有一个节点。 Java 应用向 NLB 发出 http 请求。此 NLB 配置在两个可用区上,因此每个可用区都有一个端点。每个可用区都有一个侦听 https 的 EC2 实例。

初步分析

到目前为止,我知道三个问题:

  1. 默认情况下,NLB 端点仅将请求转发到同一可用区内的节点。此行为可以通过“跨区域负载平衡”选项进行修改。我担心启用此选项可能会导致不良的子效应。
  2. 请求是 https,开启Keep-Alive。除非有人断开连接,否则连接将被重用,这可能会导致粘连到一个节点。
  3. NLB 负载均衡是通过 DNS 轮询实现的,暂且不论 1 中提到的跨区域负载均衡。同时,Java 应用程序默认缓存 DNS 查询结果。通过 JVM 设置禁用它networkaddress.cache.ttl=0可能会每次都强制进行 DNS 查询。但我担心这可能会导致 DNS 泛洪或类似情况,这对网络不利。

我尝试启用“跨区域负载平衡”并添加“Connection:close”请求标头,以避免 1) 和 2)。 初次尝试似乎不错,但不确定是否正确,尤其是在请求较大或高负载情况下等。

相关内容