平均每月一次,我在 AWS EC2 计算机上运行的 Java 应用程序会失去与 AWS SQS 的连接:
尝试与服务交互时收到 UnknownHostException。查看无法解析的确切端点的原因。如果这种情况发生在以前工作的端点上,则可能存在网络连接问题,或者您的 DNS 缓存可能存储端点的时间过长。
根本原因:
java.net.UnknownHostException: sqs.eu-west-3.amazonaws.com
我检查了我的java缓存DNS配置,这是docker镜像的默认配置
amazoncorretto:17-alpine
:
networkaddress.cache.ttl=30
networkaddress.cache.negative.ttl=10
以下是我使用 AWS SDKv2 配置 SqsClient 的方法:
SqsClient sqsClient = SqsClient.builder()
.region(Region.EU_WEST_3)
.credentialsProvider(InstanceProfileCredentialsProvider.create())
.build();
以及我如何消费消息:
ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder()
.queueUrl(queueUrl)
.maxNumberOfMessages(1)
.visibilityTimeout(30)
.build();
sqsClient.receiveMessage(sqsRequest)
.messages()
.forEach(message -> /*some processing*/);
当我使用
SqsClient
的默认配置时,我使用 software.amazon.awssdk.core.retry.RetryMode.STANDARD
重试两次,指数回退从 100 毫秒开始,这意味着我将重试不到一秒,因此低于我的 networkaddress.cache.negative.ttl
配置。
eu-west-3
SQS 队列,它们的配置方式或多或少相同。他们不应该同时抛出UnknownHostException
吗?我偶尔也遇到过类似的情况,频繁调用S3 API。
无论根本原因是什么,我都会增加重试次数。从 100 毫秒开始的指数退避意味着您将在一个小窗口中尝试两次。