[AWS] SQS FIFO의 사용 구조

이전 포스트
https://blog.naver.com/sssang97/223532430034

SQS FIFO는 순서를 보장하는 SQS의 다른 버전이다.

https://aws.amazon.com/ko/sqs/features/
기본적인 틀은 SQS Standard와 공유하지만, 많은 것이 다르다.



Exactly Once

SQS Standard가 At Least Once라서 중복 전송이 발생할 수 있는 것과 다르게, FIFO는 정확히 한번 전송될 것을 보장한다.
이런 부분에서는 신경쓸 것이 적다.




순서 보장

먼저 넣은 메세지가 먼저 소비될 것을 보장한다.
이를 통해 거래 시스템 같은 선점, 순서가 중요한 케이스를 처리할 수 있다.




비용

SQS Standard보다는 비교적 비싸나, 그래도 기본적으로 매우 저렴한 편이다.

https://aws.amazon.com/ko/sqs/pricing/




제한된 성능

SQS Standard가 무제한의 TPS를 허용하는 반면, FIFO는 순서 보장이나 일관성 보장 때문에 성능적인 한계점이 존재한다. 초당 처리량(TPS) 자체에 명백한 상한선이 걸려있는 것이다.

일반적으로는 300 TPS가 상한선이고, 그 이상은 받지 못한다.
대신 SendMessage을 사용할때 Batch를 통해 최대 10개 메시지를 묶어서 보낼 수 있는데, 이러면 최대 초당 3000개를 보낼 수 있다.
근데 여기에는 리전 차별이 좀 심한 편이다. 서울은 좀 천대받는 리전이고, 미국이나, 도쿄, 유럽, 싱가폴 같은 부자리전들은 수천 단위의 TPS도 허용해준다.

이 TPS 제한은 큐 전체에 적용되는 것이라, 메세지 그룹으로 영역을 쪼갠다 하더라도 다 묶어서 제한에 걸린다. 메세지 그룹으로 분산하더라도 처리량을 늘릴 수는 없다.




높은 처리량 (high-throughput)

SQS FIFO는 처리량을 높일 수 있는 옵션을 제공한다.
왜 이게 기본 옵션이 아닌지는 모르겠는데... 아무튼 이걸 켜면 일부 귀족 리전들을 제외하면 2400 TPS까지 나온다. 10개씩 묶어서 Batch로 날리면 최대 24000개다.

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/quotas-messages.html




메세지 그룹

FIFO는 메세지를 전송할때 메세지 그룹ID란걸 보낸다.

같은 그룹에 속하는 메세지들끼리는 순서가 보장되지만, 다른 그룹끼리는 보장되지 않는다.

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/high-throughput-fifo.html#partitions-and-data-distribution
예를 들어 하나의 상품에 대해서 거래 요청을 순서를 통해 제어한다고 하면, 상품ID을 기준으로 메시지 그룹을 구성할 수 있겠다. 그러고 그 상품에 대해서만 선점을 확실히 처리하면 되는 것이다.

그리고 이거 넣는다고 해서 딱히 그룹 기반으로 부하 분산이 돼서 TPS가 는다거나 하는건 아니다.




메시지 중복 제거

메세지 중복 제거는 FIFO에서 메세지를 보낼때 필요한 옵션 중 하나다.
이걸 기반으로 해서 혹시나 Producer 측에서 중복으로 메세지를 쌓는 것을 방지한다.

SQS FIFO는 같은 중복제거 ID로 들어온게 있으면, 최초 메시지 이후에 들어온걸 전부 삭제해버린다.
중복으로 판단하는 기간은 5분이다.

이렇게 한번 넣으면


이후에 넣으면, 들어간것처럼 보이지만


최초 전송을 제외하면 다 씹혀있다.

딱히 이런 처리가 필요한게 아니라면 uuid 같은거 생성해서 박으면 된다.




Lambda와의 통합

SQS FIFO와 Lambda를 연동하면, Lambda도 FIFO의 순서 보장을 따라간다.

같은 메시지 그룹의 메시지가 여러개 전송되더라도, Lambda는 한번에 하나씩만 순서대로 실행된다. 이 보장은 FIFO와 마찬가지로 메시지 그룹 내에서만 보장된다.
그래서 빠른 동시성 처리를 원한다면 순서 보장이 필요없는 부분에 대해서는 메세지 그룹을 적절히 분할할 필요가 있다. 그래야 Lambda도 동시에 돌면서 일할 수 있기 때문이다.





Fan-out

SQS FIFO는 TPS 제한 때문에 사용량이 제한되는 부분이 존재한다고 했었다.
하지만 AWS SNS와 결합하면 팬아웃을 통해 수평 확장으로 사용량을 늘릴 수 있는 부분이 존재한다.

이건 별도 포스트로 정리해보겠다.




참조
https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/quotas-messages.html
https://www.linkedin.com/pulse/sqs-fifo-queues-interesting-surprising-facts-mukund-patil-eyi4f
https://stackoverflow.com/questions/44660879/aws-sqs-fifo-tps-limit-per-message-group