![为什么客户端有时无法连接到 EC2 应用程序负载均衡器?](https://linux22.com/image/780348/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9C%89%E6%97%B6%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%20EC2%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%EF%BC%9F.png)
背景
我已经创建了一个双栈 ec2 应用程序负载均衡器,并配置了一个 A DNS 记录以指向该应用程序负载均衡器。
我有一个 Android/iOS 应用程序,可以连接到该 ALB 进行工作。
DNS 输出
挖掘 api-lb-ext.unolo.com
; <<>> DiG 9.16.1-Ubuntu <<>> api-lb-ext.unolo.com ; 全局选项:+cmd ;; 得到答案: ;; ->>HEADER<<- 操作码:QUERY,状态:NOERROR,id:52783 ;; 标志:qr rd ra;查询:1,答案:3,权威:0,附加:1
;; OPT 伪部分: ; EDNS:版本:0,标志:; udp:65494 ;; 问题部分:;api-lb-ext.unolo.com。在
;; 答案部分:api-lb-ext.unolo.com。60 IN A 15.207.81.176 api-lb-ext.unolo.com。60 IN A 13.233.27.203 api-lb-ext.unolo.com。60 IN A 15.206.192.130
;; 查询时间:52 毫秒 ;; 服务器:127.0.0.53#53(127.0.0.53) ;; 时间:2022 年 9 月 15 日星期四 15:00:27 IST ;; 收到的消息大小:97
问题
99.9% 的时间里,客户端打开与该应用程序负载均衡器的 TCP 连接都没有问题。
但有时客户端无法连接到负载均衡器。我不确定是 DNS 查找失败还是无法连接到我的后端服务。
代码结构
使用 Android 上的 retrofit 库 (com.squareup.retrofit/1.9.0),我们对我的后端 API (api-lb-ext.unolo.com) 执行调用。
根据他们的文件(https://square.github.io/okhttp/features/connections/),如果他们执行的 DNS 查找检索到多个结果,他们会循环遍历每个连接,直到成功连接到后端。基于低声的想法,我会尝试看看是否可以让它打印出它在尝试连接后端时找到的 DNS 记录。
如果发生任何类型的网络错误,我将检索客户端的 IP 地址(通过https://ipv4.jsonip.com/) 并将其打印出来给客户。客户通常只是将截图发送给我们,告诉我们他们无法登录应用程序。
我迄今为止做了哪些研究
我知道请求没有到达我的 EC2 ALB 实例 - 当这些错误发生时,我通过在客户端打印出 IP 地址并扫描我的 EC2 ALB 日志文件查找该 IP 地址来验证这一点 - 未找到。
我还要求出现此错误的客户更改其 Android 设备上的设置,使其指向 Google 的 DNS 服务器,希望他们的移动运营商所使用的默认 DNS 服务器可能无法提供 DNS 记录 - 当客户回复我时,该服务器会返回结果。
发生错误的任何模式
我看不到。我的大多数客户都是通过移动数据(而不是 WIFI)连接的。我知道 99.9% 的登录都是有效的,但是,我们每周都会收到 1-2 封支持电子邮件,其中包含此屏幕截图,显示他们无法连接到我的后端。我知道我的服务已启动并且正在运行,因为成千上万的人可以同时登录。
我目前的理论
- 我的猜测是,由于指向我的负载均衡器的 A 记录上的 TTL 非常小(60 秒),我们每次都强制进行 DNS 查找,也许 DNS 查找失败了??
需要指导
任何有关如何尝试调试这个问题的帮助都将非常感激。