안녕하세요~~ 여러분~! 공부하는개발자 입니다 ㅎㅎㅎ
이번 시간에는 바로바로~ SQS에 대해서 알아보려고 합니다.
SQS란 무엇인지, Java + Spring으로 어떻게 사용할 수 있는지,
사용시 주의할 점 등은 무엇인지 간단바리(들이파기라 해놓고 간단바리..?)로 살펴보겠습니다.
바로 시작해보죠!
AWS SQS란?
- SQS는 Simple Queue Service의 약자입니다.
- 애플리케이션 간의 메시지를 전달하기 위한 아주 '간단한' Queue 라고 생각하면 됩니다.
- 홈페이지 설명에 따르면, 지속성이 우수하고 사용 가능한 보안 호스팅 대기열을 제공하며, dead-letter queue, 표준대기열, FIFO 대기열을 지원하고 있습니다.
SQS와 MQ의 차이점
RabbitMQ를 들어본 적이 있는 사람이라면, 곧바로 이런 질문이 떠오를 것입니다.
아 메시지 큐 (써본적이 있든 없든) 알지알지... 애플리케이션 간에 비동기 상호작용을 할 때 많이 쓰잖아!! 그런데 그러면 SQS와 일반적인 MQ 차이는 무엇이지?
한 스택오버플로우에 따르면, 둘의 차이는 다음과 같습니다.
- SQS는 이름그대로 '간단한' 큐 서비스이다. 다른 MQ에 존재하는 message routing, fan-out, distribution lists를 지원하지 않는다. 메시지 생산자가 만들어낸 메시지를 메시지 소비자가 가져갈 수 있게 해주는 것이 전부이다.
- Amazon MQ는 AMQP나 MQTT처럼 표준화된 여러 broadcast 프로토콜을 완벽히 지원하는 fully managed 서비스이다. 복잡한 요구사항을 구현할 때 유영하며, AWS 외부에 있는 메시지 브로커를 AWS로 마이그레이션 할 때 유용하다.
제가 이해한 것을 토대로, SQS와 MQ의 차이를 설명하면 이렇습니다. 둘 모두 메시지 큐 범주에 속하지만 SQS는 닭잡는칼, MQ는 소잡는칼 ㅎㅎㅎㅎ 디테일한 차이가 있을 수 있겠지만, 그것은 SQS, MQ 모두를 빠삭하게 공부하고 사용해본 후에 다시 한 번 정리해보겠습니다..
AWS SQS 만들어보기
자 그러면 SQS가 무엇인지 알았으니 바로 한 번 써보도록 하겠습니다. 역시 쓰면서 알아가는 맛이 있죠 히히
AWS SQS로 메시지 쏘기 (Java + Gradle + Spring)
오호,, 이제 생성은 되었으니 Application을 이용해 해당 Queue로 메시지를 쏘고 받고 해보겠습니다.
[SQS 들이파기]에서 사용한 버전입니다.
- JDK 11
- Spring Boot 2.2.3.RELEASE
- Spring MVC
- Spring Cloud for AWS 2.2.3.RELEASE
- gradle 6.6.1
AWS SQS의 메시지 받기 (Java + Gradle + Spring)
SQS로 메시지가 잘 전송되는 것을 확인했습니다. 이제 받는 것도 확인해보겠습니다!!
DLQ 설정
SQS 총 정리
지금까지 다루어 본 것을 정리하자면, SQS는 애플리케이션 간의 비동기 처리를 할 수 있게 도와주는 Queue로 표준형과 FIFO 형이 있습니다. 또한 DLQ라는 것이 존재했으며 내부적으로 암호화를 할 수도 있습니다.
스프링에서 SQS를 사용하려면 Amazon SDK를 바로 쓸 수도 있고 아니면 wrapping된 spring-cloud-aws를 사용할 수도 있습니다. spring-cloud-aws에서 SQS로 메시지를 쏘고 받는 법 모두 살펴봤으며, @SqsListner를 사용해 메시지를 받을때 생각해야 할 멀티스레딩 관련 몇 가지도 확인해 보았습니다.
아 SQS의 요금은 이렇다고 합니다!
1백만건의 요청은 무료라고 하는데... SQS를 1개 쓰고 있고 polling duration 30초로 사용하고 있고 Consumer 서버가 3대라면 음... (86400 * 30 / 30) * 3 이니까 오호 30만건 정도... Message 생성요청이나 DELETE 요청을 count 하지 않았지만, 작은 규모에서는 거의 공짜로 쓸 수 있지 않을까 싶습니다 ㅎㅎ
이상 끝! 👏🏻
(참고) 간단 용어 정리
출처 : [아마존 웹 서비스를 다루는 기술]
- 메시지 : SQS의 기본 데이터 단위
- 큐 : 메시지를 담는 공간
- region별로 생성해야 하며 HTTP 프로토콜을 이용하여 다른 region끼리 메시지를 주고 받을 수 있다. Queue의 이름은 모든 region에서 유일해야 한다.
- 보기 제한 시간(Visibility Timeout) : 메시지를 받은 뒤 특정 시간 동안 동일한 메시지를 다른 곳에서 꺼내 볼 수 없도록 하는 제한 시간
- 지연 전송 : 특정 시간 동안 메시지를 받지 못하게 하는 기능
- 짧은 폴링(short polling) : 메시지 받기 요청을 하면 결과를 바로 받는다. 메시지가 있으면 메시지를 가져오고 없으면 그냥 빠져 나온다
- 긴 폴링(long polling) : 메시지가 있으면 바로 가져오고, 메시지가 없으면 메시지가 올 때까지 기다린다. 메시지가 계속 오지 않으면 긴 폴링 제한 시간까지 기다린다.
'개발 공부 기록하기 > 03. AWS & Infra' 카테고리의 다른 글
ulimit에 대해 알아보자 (0) | 2020.10.05 |
---|---|
패커 (Packer) 시작하기 (4) | 2020.10.01 |
[AWS SQS 들이파기] DLQ(Dead-Letter Queue) 설정하기 (0) | 2020.09.23 |
[AWS SQS 들이파기] SQS에서 메시지 받기 II (Java + Gradle + Spring) (1) | 2020.09.23 |
[AWS SQS 들이파기] SQS에서 메시지 받기 I (Java + Gradle + Spring) (0) | 2020.09.23 |