【发布时间】:2019-04-26 02:52:58
【问题描述】:
我有一个模块,它以指定的时间间隔轮询 AWS SQS 队列,每次使用 ReceiveMessageRequest 发送一条消息。方法如下:
public static ReceiveMessageResult receiveMessageFromQueue() {
String targetedQueueUrl = sqsClient.getQueueUrl("myAWSqueueName").getQueueUrl();
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(targetedQueueUrl)
.withWaitTimeSeconds(10).withMaxNumberOfMessages(1);
return sqsClient.receiveMessage(receiveMessageRequest);
}
一旦收到并处理了一条消息,它就会使用DeleteMessageResult 从队列中删除。
public static DeleteMessageResult deleteMessageFromQueue(String receiptHandle) {
log.info("Deleting Message with receipt handle - [{}]", receiptHandle);
String targetedQueueUrl = sqsClient.getQueueUrl("myAWSqueueName").getQueueUrl();
return sqsClient.deleteMessage(new DeleteMessageRequest(targetedQueueUrl, receiptHandle));
}
我创建了一个可执行的 jar 文件,它部署在大约 40 个实例中,并且正在主动轮询队列。我可以看到他们每个人都收到消息。 但在 AWS SQS 控制台中,我只能在“飞行中消息”列上看到数字 0、1、2 或 3。为什么即使有 40 多个不同的消费者从队列中接收消息,为什么会这样呢?此外,队列中可用的消息数量减少得非常缓慢。
以下是队列的配置参数。
Default Visibility Timeout: 30 seconds
Message Retention Period: 4 days
Maximum Message Size: 256 KB
Receive Message Wait Time: 0 seconds
Messages Available (Visible): 4,776
Delivery Delay: 0 seconds
Messages in Flight (Not Visible): 2
Queue Type: Standard
Messages Delayed: 0
Content-Based Deduplication: N/A
为什么即使有多个消费者,消息也没有得到快速处理?我是否需要修改任何队列参数或接收消息/删除消息请求中的某些内容?请指教。
更新:
所有 EC2 实例和 SQS 都在同一个区域中。消费者(轮询队列的 jar 文件)作为 EC2 实例的启动脚本的一部分运行。它有一个计划任务,每 12 秒轮询一次队列。在将消息推送到队列之前,我启动了 2-3 个实例。 (当时我们可能有一些已经运行的实例 - 这增加了队列的接收者数量(上限为 50)。收到消息后,它将执行一些任务(包括一些数据库操作、数据分析和计算、报告文件生成并将报告上传到 S3 等..),大约需要 10-12 秒。完成后,它会从队列中删除消息。下图是过去 1 周的 SQS 指标的屏幕截图(来自 SQS监控控制台)。
【问题讨论】:
-
Hm - 假设主机每 30 秒处理一条消息,那么单个主机应该能够每天处理 3000 条消息。根据您的 ApproxiateAgeOfOldestMessage 指标,似乎在很长一段时间内几乎没有完成任何工作(逐渐上升) - 那里发生了什么?
标签: java amazon-ec2 aws-sdk amazon-sqs