繁体   English   中英

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

[英]Amount parallel processing Simple Queue Service (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 条?

我找到了解决方案。

需要用@Async注释方法,将deletionPolicy @Async更改为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
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM