반응형
이번에는 SQS 메시지의 수신 오류가 발생한 상황을 어떻게 해결할지 알아보자
스프링 부트에서 SQS를 사용하여 메시지를 처리하던 중 오류가 발생했다. 초기에는 이 오류를 @SqsListener 메서드 내부에서 발생한 문제로 생각하여 스프링 코드를 수정했지만, 여전히 같은 오류가 발생했다. 그래서 오류의 원인을 찾아보던 중 중요한 사실을 알게 되었다.
이전에 발생한 오류는 SQS의 메시지 내부에 문제가 있었기 때문이다. SQS 메시지 자체에 문제가 있었기 때문에 해당 메시지는 계속해서 처리되지 않았다. 그리고 오류가 발생한 메시지는 계속해서 큐에서 polling되고 있었다. 이로 인해 같은 오류 메시지가 300번 이상 polling되는 상황이 발생했다.
이번 포스트에서는 오류가 발생한 SQS메시지가 제대로 처리되지 않아 계속 polling될 때 수동으로 직접 이 메시지를 삭제 처리하는 방법을 설명한다.
1. SQS메시지 오류 파악을 위해 콘솔 접속하기
1-1. SQS 메시지 리스트 확인
- SQS메시지 대기열에서 내가 삭제하고자 하는 메시지가 있는 SQS 이름을 클릭한다.
- SQS의 이름을 클릭했다면 아래와 같은 페이지로 이동할 것이다.
1-2. "메시지 전송 및 수신"으로 들어가기
- "메시지 전송 및 수신"을 클릭해서 들어간 다음 하단으로 스크롤 하면 아래와 같이 메시지를 polling할 수 있는 화면이 나온다.
2. SQS 메시지 오류 분석 - 메시지의 "수신 수" 란 무엇인가?
2-1. "수신 수" 란 무엇인가?
AWS SQS에서 "수신 수"는 해당 메시지가 큐에서 얼마나 많이 검색(retrieved)되었는지를 나타내는 수치다. 즉, "수신 수"가 345라는 것은 해당 메시지가 345번 큐에서 받아져 처리를 시도되었다는 뜻이다. 이 수치가 높다는 것은 일반적으로 메시지 처리에 문제가 있을 수 있음을 나타낸다. 예를 들어, 메시지를 성공적으로 처리하지 못하고 큐에 다시 반환되었거나, 처리 시도 중에 예외가 발생하여 메시지가 다시 큐로 돌아간 경우 등이다.
AWS SQS는 메시지 처리에 실패하거나 DeleteMessage 호출을 통해 명시적으로 삭제되지 않으면 메시지를 큐에 다시 넣는다. 이렇게 하여 메시지가 유실되지 않도록 한다. 그러나 이로 인해 같은 메시지가 반복해서 수신될 수 있으며, 이는 "수신 수"가 증가하는 원인이 된다. 따라서 "수신 수"가 높은 메시지는 어플리케이션에서 적절히 처리되지 않고 있음을 나타낼 수 있으므로, 해당 메시지의 처리 로직을 검토하고 문제를 해결해야 한다.
3. "수신 수"가 많아지면 그만큼 비용이 드는가?
AWS SQS(Simple Queue Service) 비용은 주로 큐에서 메시지를 보내고 받는 횟수에 따라 결정된다. 오류가 발생했을 때 메시지를 여러 번 받는 것도 SQS의 메시지 수신 요청으로 간주되기 때문에, 오류로 인해 메시지를 여러 번 받게 되면 비용이 증가할 수 있다.
3-1. AWS SQS의 요금 체계는 다음과 같다.
- 메시지 전송 및 수신 요금
- SQS는 보통 천 단위의 요청(예: 1000개의 메시지 보내기 또는 받기)으로 요금을 부과한다. 따라서, 한 메시지를 여러 번 받게 되면, 그만큼 요금이 증가한다.
- SQS는 보통 천 단위의 요청(예: 1000개의 메시지 보내기 또는 받기)으로 요금을 부과한다. 따라서, 한 메시지를 여러 번 받게 되면, 그만큼 요금이 증가한다.
- 데이터 전송 요금
- AWS 리전 간 데이터 전송이나 인터넷을 통한 데이터 전송에 대해서는 추가 요금이 발생할 수 있다.
- AWS 리전 간 데이터 전송이나 인터넷을 통한 데이터 전송에 대해서는 추가 요금이 발생할 수 있다.
- 기타 요금
- SQS에서 제공하는 추가 기능들(예: SQS FIFO 큐, 메시지 처리 유예 시간 설정 등)에 대해 추가 요금이 부과될 수 있다.
- SQS에서 제공하는 추가 기능들(예: SQS FIFO 큐, 메시지 처리 유예 시간 설정 등)에 대해 추가 요금이 부과될 수 있다.
메시지 처리 실패로 인해 반복적으로 메시지를 수신하는 경우, 이는 비용 증가로 이어질 수 있으므로, 오류를 정확히 파악하고 빠르게 해결하는 것이 중요하다. 메시지 처리 로직을 개선하거나, 실패한 메시지를 Dead Letter Queue로 이동시켜 반복적인 처리를 방지하는 방법을 고려해볼 수 있다. AWS 비용 관리 도구를 사용하여 비용을 모니터링하고, 예산을 설정하여 지출을 관리할 수도 있다.
4. 해결 방법 - 메시지 삭제하기
나는 메시지를 직접 삭제해서 해결했다.
4-1. 오류가 발생한 SQS 메시지 삭제하기
- 삭제는 간단하다. 메시지 리스트에서 우측 상단에 있는 "삭제" 버튼을 누르면 된다.
- 삭제가 완료되면 아래와 같이 "이동 중인 메시지"가 제어되어 0으로 바뀐다.
SQS를 사용하다가 메시지를 사용하는 것에 오류가 발생해서 "수신 수"가 계속해서 늘어나고 메시지가 처리되지 않았을 때 어떻게 이 메시지를 처리해야 할지 알아봤다.
AWS의 SQS를 설정하는 방법이 궁금하다면?
이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '평양냉면7'님의 블로그도 한번 봐주세요 :)
반응형
'AWS > SNS, SQS' 카테고리의 다른 글
AWS Message-Driven 4편: SNS와 SQS를 SpringBoot에 연동하기 (2) | 2023.11.07 |
---|---|
AWS Message-Driven 완성 3편: SNS와 SQS 연동 및 테스트 전략 (2) | 2023.11.06 |
AWS Message-Driven 실전 2편: SQS 구축과 테스트 검증 (0) | 2023.11.06 |
AWS Message-Driven 입문 1편: SNS 설정으로 시작하는 MSA (0) | 2023.11.06 |