Sqs의 이동 중인 메시지란?

오늘은 배포를 앞두고, 운영 전환을 테스트 해보는데 람다가 SQS의 메시지를 소비하지 못하고 계속 방황하는 일이 있었습니다. 그래서 SQS를 살펴보는데 “이동 중” 이라는 말이 좀 낯설게 느껴져서 찾아보았습니다.
SQS의 이동 중인 메시지란?
소비자가 메시지를 받아가고, 아직 삭제하지 않은 상태를 말합니다.
이때도 메시지는 visibility timeout 동안 다른 컨슈머에게 보이지 않으며, 메시지는 큐에서 “이동 중” 상태로 표시됩니다.
이동 중인 메시지가 계속해서 남아요
이렇게 “이동 중”으로 표시되는 원인은 다양한데, 대표적으로는 delete_message 를 호출하지 못하는 경우입니다. SQS는 메시지가 소비되고 나서 자동으로 삭제되는 것이 아니라 delete_message 동작을 수행해만 메시지 삭제가 됩니다.
따라서 메시지를 소비하고 delete_message 를 호출하지 못한다면, 메시지는 삭제되지 않은 채 visibility timeout이 지나 다른 컨슈머에게 메시지가 보이게 됩니다. 이러면 메시지가 이중 처리가 되겠죠!
또한 처리 실패 이후 재시도 횟수가 남아있을 경우, 재시도 횟수에 다다를 때까지 해당 메시지 처리를 재시도 하게 됩니다. 이것이 지속적으로 계속되고 DLQ에도 가지 못한다면 반복적으로 “이동 중” 상태가 됩니다.
즉 DLQ가 제대로 설정되어 있지 않거나(혹은 아예 미설정), maxReceiveCount에 아직 도달하지 않은 상태에서는 메시지가 반복적으로 재시도되며 “이동 중” 상태와 소비를 오가게 됩니다.

in-flight인 메시지 수가 지속적으로 높다면, 어딘가에서 병목이나 오류가 발생하고 있다는 것을 의미합니다. 따라서 CloudWatch를 통해서 in-flight 메시지 수를 모니터링 + 알람 설정을 해둬야 해요.
cloudwatch에서는 ApproximateNumberOfGroupsWithInflightMessages라는 이름으로 지표를 제공합니다.
사실 그냥 “이동 중” 보다는 “in-flight”로 보여줬다면 이해가 바로 됐을 텐데 애매하게 번역이돼서 헷갈리는 것 같아요.