数量并行处理简单队列服务(SQS)

时间:2017-10-11 20:29:16

标签: java spring spring-cloud amazon-sqs

我正在使用Spring Cloud来使用简单队列服务(SQS)。我有以下并行处理配置:

@Bean
public SimpleAsyncTaskExecutor simpleAsyncTaskExecutor() {
    SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor();
    simpleAsyncTaskExecutor.setConcurrencyLimit(50);
    return simpleAsyncTaskExecutor;
}

@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(
        SimpleAsyncTaskExecutor simpleAsyncTaskExecutor) {

    SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory();
    factory.setAutoStartup(true);
    factory.setTaskExecutor(simpleAsyncTaskExecutor);
    factory.setWaitTimeOut(20);
    factory.setMaxNumberOfMessages(10);

    return factory;
}

我需要处理50个线程中的50条消息(bean SimpleAsyncTaskExecutor中的配置),但是并行处理10条消息(从SQS返回的maxNumberOfMessages)

如何处理50条消息而不是10条?

2 个答案:

答案 0 :(得分:3)

我找到了解决方案。

必须使用@Async注释方法,将deletionPolicy更改为NEVER,并在最终执行时删除该消息。

这样,队列消耗将遵循配置的线程数。例如,如果您有50个线程,将在SQS队列中发出5个请求(每个请求10个消息),从而并行处理总共50个消息。

代码如下所示:

@Async
@SqsListener(value = "sqsName", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
public void consume(String message, Acknowledgment acknowledgment) throws InterruptedException, ExecutionException {

    //your code

    acknowledgment.acknowledge().get(); //To delete message from queue
}

答案 1 :(得分:0)

我不会过多地使用特定数字(如50个主题的50条消息)。尝试对其进行性能测试(构建一些东西以将峰值时间内预期的消息数量推送到队列中,并让您的服务处理它们,看它是否存在瓶颈)。

根据您的实际问题,您无法做到。 AWS SQS根本不支持获取超过10条消息。请求。请参阅http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html以供参考。 (它在第1段中)。