2017-10-11 10 views
0

Spring Cloud를 사용하여 SQS (Simple Queue Service)를 사용하고 있습니다.금액 병렬 처리 단순 대기열 서비스 (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) 메시지 (빈 SimpleAsyncTaskExecutor의 구성을) 처리해야하지만, 병렬에만 10 개의 메시지를 처리 ​​

이 (maxNumberOfMessages는 SQS에서 반환)

: 나는 병렬 처리를 위해 다음과 같은 구성을 가지고

대신 10 개 대신 50 개의 메시지를 처리 ​​할 수 ​​있습니까?

+0

은 그래서 (병렬) 50 실에 10 개의 메시지를 처리하거나, 전체에서의 처리 (10) 메시지이야? 'SimpleMessageListenerContainerFactory.setMaxNumberOfMessages (10);을 설정 했으므로 10 개의 메시지를 50 개의 스레드와 병렬로 처리하면 그 수를 50 개까지 늘릴 수 있습니까? * 편집 * nevermind, 나는 워드 프로세서에서 최대 메시지를 볼 수 있습니다. 요청은 10입니다. 병목 현상이 발생하면 더 많은 스레드를 풀링해야합니다. –

+0

문서에서 요청 당 반환되는 최대 메시지 수는 10 개입니다. 그래서 50 개의 스레드에서 10 개의 메시지를 처리하고 있습니다. 10 개의 메시지 처리가 끝나면 새로운 요청이 만들어집니다. SQS 큐에서 50 개의 메시지가 50 개의 스레드로 처리되는 5 개의 요청을 만들고 싶습니다. –

답변

0

해결책을 찾았습니다.

@Async으로 주석을 달고 deletionPolicyNEVER으로 변경하고 실행을 완료 할 때 메시지를 삭제해야합니다.

이렇게하면 대기열 소비는 구성된 스레드 수를 따릅니다. 예를 들어, 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 
} 
0

너무 많은 특정 메시지 (예 : 50 개의 메시지 50 개)가 너무 많습니다. 대신 성능 테스트를 해보십시오 (피크 시간대에 예상되는 메시지 수를 대기열로 보내고 서비스가 병목 현상을 일으키는 지 확인하기 위해 무언가를 작성하십시오).

실제 질문과 같이 할 수 없습니다. AWS SQS는 단순히 10 개 이상의 메시지를 가져 오는 것을 지원하지 않습니다. 의뢰. 참조 용으로 http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html을 참조하십시오. (첫 번째 문단에 있음).

+0

많은 양의 메시지가 있습니다. 한 번에 10 개의 메시지만으로는 충분하지 않습니다. 문서에서 실제로 각 요청은 10 개의 메시지 만 반환하지만 SQS 큐에 둘 이상의 요청을 보내려고합니다. 예를 들어, SQS에 대해 5 건의 요청을하고 50 건의 메시지를 합계 50 건으로 처리하도록하겠습니다. –

+0

아, 네가 요점을 본다. 집행자가 동시에 폴링 요청을하고 있다고 생각했지만 실제로 메시지를 처리하는 컨테이너에서 사용되는 것을 봅니다. 나는 스프링 - 클라우드 - 아우디에 관해서 나 자신을 직접 만지기보다는 비행 중에 적절한 제안을 할 지식이 없다. 죄송합니다. –