본문 바로가기
Infra/AWS

[SQS] 메세지 지연 시키기 (+ 15분을 넘어서)

by devson 2023. 2. 4.

SQS 같은 경우 delay queues 라고하는 Consumer에게 메세지 노출을 지연시킬 수 있는 기능을 제공한다.

지연은 최대 15분까지 가능하다.

(Visibility Timeout과는 다른 개념이기 때문에 명확하게 차이를 인지해야한다)

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html

 

이 기능을 사용하면 메세지에 지연을 줄 수 있기 때문에

예약 실행 기능(정해진 시간 뒤에 특정 기능이 실행되어야하는 기능)을 개발할 때 사용될 수 있다.

 

예를 들어 '회원 가입 후 5분 뒤에 가입 축하 메세지를 보내기' 와 같은 기능이 있을 수 있는데,

회원 가입 도메인 이벤트에 대한 SQS 메세지 or 가입 축하 메세지 전송 SQS 메세지5분의 지연을 설정하고 enqueue 하면
5분 뒤에 메세지 핸들러에서 해당 메세지를 consume 하여 대상 유저에게 가입 축하 메세지를 보낼 것이다.

 

 

하지만 문제는 최대 15분이라는 제약인데, 다양한 유스케이스를 다루기엔 이 시간은 너무 짧을 수 있다.

그러면 어떻게 하면 SQS 메세지에 15분이 넘게 지연을 줄 수 있을까?

 

간단하게 아래와 같이 지연을 반복해서 주는 방식으로 처리할 수 있을 것이다.

1. 서버에서 메세지에 처리되어야할 시간에 대한 필드를 추가하고 메세지를 SQS로 enqueue 한다.

2. 서버 메세지 핸들러에서 메세지의 처리되어야할 시간에 대한 필드를 보고 메세지가 처리되어야할 시간이 되었는지 확인을 한다.

3. 아직 메세지가 처리되어야할 때가 아니라면 지연을 주고 다시 SQS로 enqueue 하고

4. 메세지가 처리되어야할 때가 되었다면 메세지를 처리한다.

 

 

위 아키텍처에서 메세지 지연을 반복하는 부분을 AWS 인프라를 좀 더 활용하는 식으로 구성한다면 아래와 같을 수 있다.

1. 서버에서 메세지에 처리되어야할 시간에 대한 필드를 추가하고 메세지를 지연 메세지를 위한 Queue로 enqueue 한다.

2. 지연 메세지를 위한 Queue를 리스닝하는 Lambda에서 메세지의 처리되어야할 시간에 대한 필드를 보고 메세지가 처리되어야할 시간이 되었는지 확인을 한다.

4. 아직 메세지가 처리되어야할 때가 아니라면 지연을 주고 다시 지연 메세지를 위한 Queue로 enqueue 하고

5. 메세지가 처리되어야할 때가 되었다면 서버의 메세지 핸들러에서 리스닝하는 Queue에 메세지를 enqueue 한다.

6. 서버 메세지 핸들러에서 5에서 보내진 메세지를 consume하고 해당 메세지를 처리한다.

 

 

 

위와 같이 지연을 반복하면 15분을 넘어서 원하는 시간만큼 메세지를 지연할 수 있게된다.

하지만 만약 예약 실행 기능 메세지 지연 사용한다면 실행 취소 기능에 대해서도 고려할 수 있는데,

이미 한 번 들어간 메세지 취소를 하는 건 쉽지 않기 때문에 서버 메세지 핸들러에서 실행 취소 여부를 확인하고

실행이 취소된 경우 해당 로직을 더 이상 실행하지 않는 방법을 사용해야할 듯 하다.

(아니면 SQS 메세지 지연을 사용하는게 아니라 다른 아키텍처를 고려해야할지도 모른다)

 
 

댓글