java - 从具有多个线程的 SQS 队列中读取

标签 java multithreading amazon-web-services amazon-sqs

注意:这是来自 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.

( http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html )

关于java - 从具有多个线程的 SQS 队列中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38752590/

相关文章:

java - 值被覆盖而不是添加

amazon-web-services - AWS - 错误 504 - 网关超时 - Flask 应用程序

amazon-web-services - AWS Secret Manager secret 检索到云前端模板 YAML

python - 从 AWS Lambda Layer 导入 cffi python 模块时出错

java - JsonIgnoreProperties 不适用于 JsonCreator 构造函数

java - 如何获取媒体播放器持续时间的正确持续时间格式?

java - 如何在 Android 中使用小空格作为数字分隔符?

c# - 锁定main()线程

c - 如何在不使用互斥量的情况下在多个线程之间进行同步,以便它们的事务 ID 是唯一的?

c# - JavaScriptCompressor、CssCompressor 和多线程