我以一种非常简单的方式使用 Amazon SQS 队列。通常,消息被写入并立即可见和读取。有时,会写入一条消息,并在队列中保持 In-Flight(Not Visible) 几分钟。我可以从控制台看到它。接收消息等待时间为 0,默认可见性为 5 秒。它将保持这种状态几分钟,或者直到写入一条以某种方式释放它的新消息。延迟几秒是可以的,但超过 60 秒就不行了。
有 8 个阅读器线程总是在进行长轮询,所以并不是有什么东西没有尝试阅读它,而是它们。
编辑:需要明确的是,所有消费者读取都没有返回任何消息,无论控制台是否打开,都会发生这种情况。在这种情况下,只涉及一条消息,它只是坐在队列中对消费者不可见。
有没有其他人看到过这种行为以及我可以做些什么来改善它?
这是我正在使用的java的sdk:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.5.2</version>
</dependency>
这是执行读取的代码(max=10,maxwait=0 启动配置):
void read(MessageConsumer consumer) {
List<Message> messages = read(max, maxWait);
for (Message message : messages) {
if (tryConsume(consumer, message)) {
delete(message.getReceiptHandle());
}
}
}
private List<Message> read(int max, int maxWait) {
AmazonSQS sqs = getClient();
ReceiveMessageRequest rq = new ReceiveMessageRequest(queueUrl);
rq.setMaxNumberOfMessages(max);
rq.setWaitTimeSeconds(maxWait);
List<Message> messages = sqs.receiveMessage(rq).getMessages();
if (messages.size() > 0) {
LOG.info("read {} messages from SQS queue",messages.size());
}
return messages;
}
发生这种情况时,“read ..”的日志行永远不会出现,它是导致我进入控制台并查看消息是否存在的原因,它确实存在。