我有一个模块,该模块以指定的时间间隔ReceiveMessageRequest
一次轮询一个AWS消息队列。方法如下:
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)监视控制台)。
答案 0 :(得分:4)
我将尽力提供所提供的信息。有关处理循环逻辑,区域设置和指标的更多详细信息(请参阅下文)将有助于改善此答案。
我创建了一个可执行的jar文件,该文件部署在大约40个实例中,并正在主动轮询队列。我可以看到他们每个人都收到消息。但是在AWS SQS控制台中,我在“飞行消息”列中只能看到数字0、1、2或3。为什么即使有40多个不同的使用者都从队列中接收消息,也为什么呢?另外,队列中可用消息的数量减少得非常缓慢。
为什么即使有多个使用者也无法快速处理消息?我是否需要修改任何队列参数或接收消息/删除消息请求中的某些内容?
您没有看到与正在处理邮件的主机数量更紧密相关的机上号码这一事实肯定说明了一个问题-邮件处理速度很快(似乎不是情况),否则您的房东没有按照您认为的去做。
通常,从SQS提取和删除单个消息应花费几毫秒的时间。如果没有更多详细的设置,这应该可以帮助您开始进行故障排除。 (其中一些步骤似乎很明显,但是其中每一个都是我见过开发人员遇到的现实生活问题的来源。)
getQueueUrl
即可在应用程序的生命周期内执行一次。您不需要重复调用它,因为它是相同的URL
更多说明: