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

std*_*bar 6 java multithreading amazon-sqs amazon-web-services

注意:这是来自此处的线程的重新发布。

大家好,我有一个处理单个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
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到的是线程之间有大量重复的消息。我知道我应该在这里和那里看到一些重复,但是似乎每个线程都收到相同的消息集,实际上,只有一个线程可以完成很多工作。

我是误解了如何使用API​​还是做错了其他事情?Javadocs指出AmazonSQS类是线程安全的,实际上,即使为每个线程创建一个新的AmazonSQS类也没有改变。

任何指针将不胜感激。我当前的解决方案是从SQS队列中读取单个线程,将每个消息放入类似LinkedBlockingDeque的内容中,然后由工作人员读取。但是我觉得该实现不会像我希望的那样快耗尽队列。

jba*_*eda 5

由于每条消息都有一个数据库命中,因此处理每条消息似乎都需要时间。您应该增加队列的可见性超时。

来自 AWS SQS 文档:

消息收到后立即保留在队列中。为了防止其他使用者再次处理该消息,Amazon SQS 设置可见性超时,即 Amazon SQS 阻止其他使用组件接收和处理该消息的一段时间。

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