注意:这是来自 here 的帖子的转贴.
大家好, 我有一个处理单个 SQS 队列中的消息的进程。队列中可以有很多消息,每条消息都会导致数据库命中。因此,我想给这个队列的读者发帖。
每个线程的基本代码是:
public void run() {
while(true) {
ReceiveMessageRequest rmr = new ReceiveMessageRequest(queueUrl)
.withMaxNumberOfMessages(10)
.withWaitTimeSeconds(3);
List<Message> messages = sqsClient.receiveMessage(rmr).getMessages();
// process messages
// delete messages
}
}
我看到的是线程之间有大量重复的消息。我知道我应该期望这里和那里有一些重复,但似乎每个线程都收到相同的消息集,而且实际上,只有一个线程做过很多工作。
是我误解了如何使用 API 还是我做错了什么? Javadoc 表明 AmazonSQS 类是线程安全的,事实上,即使为每个线程创建一个新的 AmazonSQS 类也没有任何改变。
任何指针将不胜感激。我目前的修复想法是让一个线程从 SQS 队列中读取,将每条消息放入类似 LinkedBlockingDeque 的内容中,然后让工作人员读取它。但我觉得该实现不会像我希望的那样快地耗尽队列。
最佳答案
由于您对每条消息都有一个数据库命中,因此处理每条消息似乎需要时间。您应该增加队列的可见性超时。
来自 AWS SQS 文档:
Immediately after the message is received, it remains in the queue. To prevent other consumers from processing the message again, Amazon SQS sets a visibility timeout, a period of time during which Amazon SQS prevents other consuming components from receiving and processing the message.
关于java - 从具有多个线程的 SQS 队列中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38752590/