메시지

차분한열정·2022년 4월 30일
0

AWS SQS

목록 보기
3/3

1. Message Id vs. Receipt handle

SendMessage 요청에 대한 응답 속에는 시스템이 부여한 해당 메시지의 id가 들어 있다. 이 id로 메시지를 식별할 수는 있지만 이것으로 메시지를 큐에서 삭제할 수는 없다.
메시지를 큐로부터 받을 때 대신 우리는 receipt handle이라는 것을 받는데 이것을 사용해서 메시지를

  • 삭제하거나
  • visibility를 바꿀 수 있다.
    따라서 우리가 메시지를 삭제하려면 일단 그전에 무조건 일단 해당 메시지를 받기는 해야하는 것이다.
    *만약 동일한 메시지를 두 번 받은 경우 receipt handle이 서로 다른데 이때는 가장 최근에 받은 received handle 값을 사용해야 삭제할 수 있다.

참고로 FIFO 큐를 사용하는 경우 컨슈머가 메시지를 처리하는데 오래 걸려서 Visibility Timeout을 높은 값으로 설정해두었다고 해보자. 이런 설정에서 컨슈머가 ReceiveMessage 액션을 시도한 후에 네트워크 문제가 생겨서 연결이 끊겼다고 하면 컨슈머가 메시지를 받지 못해서 에러가 발생할 것이다. 하지만 이미 Visibility Timeout이 시작되어 다시 재시도를 해도 메시지를 받을 순 없을 것인데, 그럼 다른 컨슈머가 다시 해당 메시지를 컨슘할 수 있을 때까지(=Visibility Timeout이 끝나기 전까지) 메시지 순서 보장을 위해 FIFO 큐가 정지된 상태로 남게 될 것이다.

만약 이것이 싫다면 ReceiveMessage 요청을 보낼 때 ReceiveRequestAttemptId를 설정해서 보내면 된다. 첫 번째 ReceiveMessage 요청 이후 5분 안으로 해당 첫 번째 요청과 동일한 ReceiveRequestAttemptId를 가진 ReceiveMessage 요청을 보낸다면 설사 Visibility Timeout 이전이라 하더라도 동일한 메시지들과 receipt handles를 받을 수 있다. 이러한 retry가 deduplication interval 안으로 발생한다면 그때마다 Visibility Timeout은 리셋된다.

2. Attribute

하나의 메시지는 최대 10개까지의 Attribute를 가질 수 있고 각 Attribute에 사용자는 원하는 정보를 심을 수 있다. Attribute는 Message body와는 분리된 것으로 꼭 정보를 넣지 않아도 상관은 없다.

하나의 Attribute은
(Name) - (Type) - (Value)로 구성된다.
Type에는 String / Number / Binary가 들어갈 수 있다.

3. System Attribute

Attribute말고 System Attribute라는 것도 있는데 AWS X-Ray 등과 같은 다른 AWS 서비스에서 활용될 수 있도록 붙이는 메타데이터이다. (현재 유일하게 지원하는 System Attribute은 AWSTraceHeader이다.)

profile
성장의 기쁨

0개의 댓글