다른 답변으로 언급 한 것처럼 SQS에서 오는 중복 메시지는 방지 할 수 없습니다.
대부분의 경우 메시지는 소비자 중 한 사람에게 한 번 전달되지만 어떤 경우에는 번으로 중복됩니다.
이 질문에 대한 쉬운 대답은 생각하지 않습니다. 중복을 피할 수있는 적절한 아키텍처가 필요하기 때문에 자연에서 멱등수를 의미하기 때문입니다.
분산 아키텍처의 모든 작업자가 멱등 (idempotent)이라면 복제에 대해 걱정할 필요가 없기 때문에 쉽습니다. 그러나 현실적으로는 그런 종류의 환경이 존재하지 않습니다. 어딘가에 무언가 그것을 처리 할 수 없을 것입니다.
현재이 문제를 해결해야하는 프로젝트를 진행하고 있으며이를 처리 할 수있는 방법을 제안합니다. 내 생각을 공유하는 것이 다른 사람들에게 도움이 될 것이라고 생각했습니다. 그리고 내 사고에 대한 피드백을 얻는 것이 좋은 장소 일 수 있습니다.
사실 저장소
그것은 그들이 이론적으로 영향을받는 모든 다운 스트림 시스템에서 같은 상태를 재현 재생할 수 있습니다 사실을 수집 할 수 있도록 서비스를 개발하는 아주 좋은 생각이다.
예를 들어 주식 거래 플랫폼 용 메시지 브로커를 구축한다고 가정 해 보겠습니다. (나는 전에 이런 프로젝트를 실제로 해왔지만, 그것은 끔찍했지만 좋은 학습 경험이었습니다.이제)
의가 들어올 무역, 그리고에 관심이 3 개 시스템이 있다고 가정 해 봅시다 :
- 모든 거래와 대조
- 시스템을 업데이트 상태를 유지해야하는 오래된 학교 메인 프레임 FTP 서버
- 거래를 기록하고, 새 주인이 조금 복잡의
에게 주식을 재 할당 서비스에 파트너와 공유, 나는 케이 지금은,하지만 그 아이디어는 하나의 메시지 (사실)가 들어오고 있으며, 여러 가지 분산 된 다운 스트림 효과를 가지고 있습니다.
이제 브로커에 들어오는 모든 거래를 기록한 사실 저장소를 유지한다고 가정 해 봅시다. 그리고 3 명의 모든 다운 스트림 서비스 소유자는 지난 3 일간 모든 데이터를 잃어 버렸다고 말합니다. FTP 다운로드는 3 일 뒤이고, 메인 프레임은 3 일 뒤이고, 모든 거래는 3 일 뒤에 있습니다.
사실 저장소가 있으므로 이론적으로 이러한 메시지를 특정 시간부터 특정 시간까지 재생할 수 있습니다. 이 예에서는 3 일 전부터 지금까지입니다. 그리고 다운 스트림 서비스가 포착 될 수 있습니다.
이 예제는 조금 위에 보일 수도 있지만, 매우 구체적인 것을 전달하려고합니다. 사실은 추적해야 할 중요한 것입니다. 왜냐하면 그것이 우리의 아키텍처에서 중복과 싸우기 위해 사용하기 때문입니다 .
팩트 저장소가 당신에게 CAP theorem, 일관성 및 가용성의 CA 부품을 제공하는 지속성 계층에 사실 저장소를 구현 제공 중복 메시지
에 도움이 어떻게, 다음을 수행 할 수 있습니다
를
대기열에서 메시지를 받자 마자 바로이 메시지를 이미 본 적이 있는지 여부와 사실이 잠겨 있는지 여부, 보류 중 상태인지 팩트 저장소에 체크인합니다. 필자의 경우 사실 저장소를 구현하기 위해 MongoDB를 사용할 것이지만, 다른 DB 기술이 이것을 처리 할 수 있어야합니다.
사실이 아직 존재하지 않으면 보류 중 상태 및 잠금 만료 시간이있는 사실 저장소에 삽입됩니다. 이 작업은 두 번 발생하지 않기 때문에 원자 연산을 사용하여 수행해야합니다. 여기서 서비스의 idempotence을 보장합니다.
는
해피 경우 - 시간
팩트 저장소가 사실은 존재하지 않았다, 그리고 잠금이 만들어 졌는지를 말하는 당신의 서비스에 돌아 오면 대부분의 서비스는 작업의 수행을 시도 일이 발생 . 완료되면 은 SQS 메시지을 삭제하고 사실을 완료로 표시합니다.
중복 메시지
그래서 메시지를 통해 제공하고 중복이 아니다 때 발생합니다. 그러나 중복 메시지가 언제 들어 왔는지 살펴 보겠습니다. 서비스가이를 선택하고 팩트 저장소에 자물쇠로 레코드하도록 요청합니다. 팩트 저장소는 이미 존재한다는 것을 알려주고 잠겨 있습니다. 서비스가 메시지를 무시하고 건너 뜁니다!메시지 처리가 완료되면 다른 작업자가 대기열에서이 메시지를 삭제하고 다시 표시하지 않습니다.
재해 케이스 - 서비스가 가게에 처음으로 사실을 기록 할 때
그래서 무슨 일이 후 일정 기간 동안 잠금을 얻을 일이 드물게 발생하지만, 쓰러져서? 만약 SQS가 선택 되었다면 다시 SQS가 당신에게 메시지를 보여줄 것입니다. 서비스가 제한된 시간 동안 잠금을 유지하도록 팩트 스토어를 코딩하는 이유는 무엇입니까? 그것이 넘어지면 우리는 SQS가 메시지를 서비스 나 다른 인스턴스에 나중에 표시하여 해당 서비스가 사실을 상태 (실행)에 통합해야한다고 가정 할 수 있기를 원합니다.
[SQS 대기열에서 많은 소비자 사용하기] (http://stackoverflow.com/questions/37472129/using-many-consumers-in-sqs-queue) – Krease
AWS는 이제 [fifo queues] (http : //docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)에서 "정확히 한 번만 처리되지만 초당 300 회의 트랜잭션으로 제한됩니다." – bishop