질문 ?
- end-point를 따라가다가 end-point가 지정되어 있지 않은 P2PListener을 발견했고, 해당 리스너에는 SQS를 구독한다. 라고 되어 있는 주석을 보고,
- 이 리스너는 어떠한 역활을 하는지, SQS와 어떠한 관련이 있는지가 궁금하여 SQS에 대한 개념 정리 필요
- SQS(Simple Queue Service) 란 ?
- 해야 할 일을 나중에 처리하거나 다른 시스템이 처리 할 수 있도록 하기 위한 비동기 메시징 서비스이다.
- 처리해야 할 업무에 대한 TODO 리스트와 같은 역할을 하며, 시스템에서는 이를 메시지라고 부른다.
- SQS는 이러한 메시지의 저장소이다.
- 시스템적으로 queue를 어떻게 사용할까?
- 웹브라우저에 접속해서 새로운 글을 서버에 추가를 하게 된다면 서버에 구독하고 있는 사용자들에게 이메일을 발송해서 새로운 글이 추가되었다고 알림을 주는 서비스라고 가정해보았습니다.
- 웹브라우저가 서버에 새로운 글 추가를 요청하게 되면 서버측에서는 새로운 글을 추가하고 각 구독자들에게 한명한명 이메일을 발송해야 됩니다.
- 만약에 이 시간이 두시간이라고 한다면 사용자가 새로운 글을 추가하고 2시간동안 이메일이 다 발송되어질 때까지 기다려야 하고 그이후의 다른 작업을 할 수 있다! 라면 이것은 좋은 서비스일까 ?
- 웹 브라우저가 새로운 글을 추가하면 서버는 해당 정보를 데이터베이스에 저장을 하고 [ 새로운 글을 저장했다. ] _ [ To-Do ] 라는 사실만 메시지에 넣어서 큐에 저장을 하고 응답을 보내게 된다.
- 사용자 입장에서는 해당 정보를 데이터베이스에 저장하는 시간만을 기다리면 되고 실제 이메일을 발송하는 시간은 기다리지 않아도 된다.
- 서버 입장에서도 수천명의 요청을 동시에 처리하는 것은 힘들기 때문에 먼저 들어온 요청별로 순차적으로 처리해 나아가는 것이 더 안정적이다.
결과적으로
- queue에 to-do list가 순차적으로 쌓이게 되면 이러한 메시지들을 순차적으로 꺼내서 처리를 할 수 있고, 리눅스의 cron과 같은 서비스를 이용해서 반복적으로 sqs에 접속하여 새로운 메시지 존재 여부를 확인하여 대기하고 있는 메시지 여부를 확인하여 메시지에 해당하는 작업을 수행하고, 그 작업이 종료되면 삭제함으로써, 중복 작업 또는 누락을 방지해준다.
- SQS 동작 원리
- 메시지를 생산하는 서버(component 1)에서 메시지를 SQS에 전송합니다. 그리고 이 메시지는 SQS에 동일한 값이 여러곳에 중복으로 저장됩니다.
- 메시지를 소비하는 서버(component 2)에서 메시지를 처리할 준비가되면 큐에서 메시지를 가져옵니다. 메시지가 한 서버에 의해서 처리될 동안 SQS에서는 메시지가 없어지지않고 그대로 남아있습니다.
한 서버에서 처리 중일 때, 다른 서버에서 중복으로 읽지 못하게 하기 위해 visibility timeout을 사용합니다.
- 메시지를 소비하던 서버에서 완료가 되면, SQS에 delete 메시지를 전달합니다.
이렇게 하면, SQS에 있는 중복 분산되어있던 해당 메시지가 삭제되게 됩니다.
- SQS의 동작 방식 _ 2가지
- SQS는 기본적으로 표준 대기열로 동작하고, 다른 특징을 가지고 있는 FIFO 대기열로 사용할 수도 있습니다.
- FIFO 대기열
- API 작업 별 초당 최대 3000개의 트랜잭션 지원 (높은 처리량)
- 모든 메시지를 정확히 1회 처리함을 보장
- 정확한 순서를 보장
- FIFO 대기열
- '
- 표준 대기열
- API 작업 별 초당 무제한의 API 호출 수를 지원 (무제한 처리량)
- 각 메시지의 최소 1회 전달을 보장
- 정확한 순서를 보장하지 않는다. (최선의 순서 지정)
- 표준 대기열
- 또 다른 AWS 내 메시징 서비스 _ SNS
- SQS vs SNS
- SNS
- 애플리케이션에서 정기적으로 업데이트를 확인하거나 '폴링'할 필요 없이 '푸시' 매커니즘을 통해 다수의 구독자에게 시간이 관건이 메시지를 보낼 수 있다.
- SQS
- 분산 애플리케이션에서 폴링 모델을 통해 메시지를 교환하는데 사용되는 메시지 대기열 서비스이다.
- 해당 서비스를 통해 송신 구성 요소와 수신 구성 요소를 분리할 수 있다.
- AWS에서 SNS를 사용하는 일반 적인 패턴 제시
- SNS를 통해 메시지를 SQS 대기열로 게시하여 비동기식으로 하나 이상의 시스템 구성 요소로 안정적으로 전송하는 것
- SNS
- 첫번 째 → 사용자가 결제를 했을 때, 결제 정보를 이메일로 보내주는 역활
- 두번 째 → 거래 분석 서비스로 결제가 이루어질 때마다 결제 정보를 SQS에 저장한 후, EC2를 사용하여 queue에 있는 메시지를 꺼내와서(poll) 분석 진행
- 세번 째 → 거래 정보가 사기 여부 분석 서비스로 2번째와 마찬가지로 진행
- 이 3가지의 서비스는 각자 다른일을 하지만, 결제 정보라는 동일한 이벤트를 기반으로 운영된다.
- 즉, 서로 다른 사용자(서비스)들이 동일한 하나의 이벤트에 관해 각각의 동작을 진행하는 방식 → 이때 SNS가 필요 하다.
- 만약에 이 3개의 서비스를 한번에 실행하게 된다면 중간에 오류가 발생했을 때, 처음부터 다시 실행해야 한다. → 비효율적
- 따라서 서비스를 최대한 쪼개어 독립적으로 실행될 수 있도록 하는 것이 중요하다.
- 차이점 정리
- SNS
- push : 사용자에게 메시지를 전송
- fanout : 같은 메세지를 여러 방향으로 발행
- 메시지를 받는 사용자가 없으면 몇번 시도 후의 삭제된다.
- 하나의 메시지를 사용자(서비스)들이 각각 다른 방식으로 활용
- SQS
- pull : 사용자가 메시지를 가져온다.
- decouple : 여러 서비스로 분리하여 병렬식 비동기 처리
- 메시지는 일정 기간동안 유지
- 하나의 메시지를 사용자들이 동일한 방식으로 활용
'배움 기록_실무 ✏️' 카테고리의 다른 글
구글 OAuth2 인증 방식 (0) | 2022.03.29 |
---|---|
OAuth 동작 방식 (1) | 2022.03.29 |
쿠팡 파트너스 API 연동 (2) | 2022.02.28 |
Spring batch 개발 (4) | 2022.02.10 |
JWT에 대해서 (1) | 2022.01.10 |