본문 바로가기
공부/프로그래밍

[aws, sqs, springboot] fifo 전송 에러 (A queue already exists with the same name and a different ...)

by demonic_ 2021. 9. 22.
반응형

FIFO 설정으로 전송중에 다음 에러가 발생했다

com.amazonaws.services.sqs.model.QueueNameExistsException: A queue already exists with the same name and a different value for attribute ContentBasedDeduplication (Service: AmazonSQS; Status Code: 400; Error Code: QueueAlreadyExists; Request ID: b5a82b14-e18c-566a-98fd-72d04c2cf; Proxy: null)

 

해석해보면 ContentBasedDeduplication 의 속성에 대해 동일한 이름과 다른 값을 가진 Queue가 존재한다는 뜻이다.

 

그럼 이 설정을 어떻게 수정하면 될까? 정답은 AWS Console 에서 중복제거를 통해 가능하다.

 

SQS 에서 fifo 대기열에 들어가 편집을 누른다.

 

설정중에 '콘텐츠 기반 중복 제거' 설정을 활성화 한다

 

상황에 대한 해결은 여기서 끝이다. 이제부턴 잘 전송된다.

아래부터는 설정에 대한 상세 설명이다

 

위 설정은 기본값은 아니다. 그런데 FIFO를 전송하려다 보면 다음의 옵션을 true 로 해야한다고 나온다

com.amazonaws.services.sqs.model.AmazonSQSException: The queue should either have ContentBasedDeduplication enabled or MessageDeduplicationId provided explicitly (Service: AmazonSQS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 57496572-bccf-5bee-a0ac-3cb611c97d1c; Proxy: null)

 

ContentBasedDeduplication 나 MessageDeduplicationId를 활성화 해야한다고 나온다. 관련설정은 다음과 같이 할 수 있다. (아울러 fifo 전송 설정도 on 하려면 아래 설정을 따라야 한다)

...
    private String getQueueUrlFifo() {
        Map<String, String> attributes = new HashMap<String, String>();
        attributes.put("FifoQueue", "true");
        attributes.put("ContentBasedDeduplication", "true"); // 이부분

        final CreateQueueRequest createQueueRequest = new CreateQueueRequest(queueName).withAttributes(attributes);
        return amazonSQS.createQueue(createQueueRequest).getQueueUrl();
    }
...

 

관련 설정에 대한 것은 다음 AWS 문서를 참조하라고 링크되어 있는데, 문서를 보면 다음 내용이 있다.

번역하면 다음과 같다

FIFO(선입선출) 대기열은 작업 및 이벤트 순서가 중요하거나 중복을 허용할 수 없는 경우 애플리케이션 간의 메시징을 향상하도록 설계되었습니다. FIFO 대기열을 사용할 수 있는 상황의 예는 다음과 같습니다.

사용자가 입력한 명령이 올바른 순서로 실행되는지 확인합니다.

가격 수정을 올바른 순서로 전송하여 올바른 제품 가격을 표시합니다.

학생이 계정을 등록하기 전에 코스에 등록하는 것을 방지하기 위해.

 

즉 콘텐츠 중복 방지를 당연히 활성화 해야 한다

 

참고: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-exactly-once-processing

 

Amazon SQS FIFO (First-In-First-Out) queues - Amazon Simple Queue Service

The name of a FIFO queue must end with the .fifo suffix. The suffix counts towards the 80-character queue name quota. To determine whether a queue is FIFO, you can check whether the queue name ends with the suffix.

docs.aws.amazon.com

 

 

때문에 ContentBasedDeduplication 를 true 로 하다보니 중복된 메세지가 나와서 발생한 오류다.

 

 

끝.

 

반응형

댓글