티스토리 뷰
회사를 이직하고나니까 많은 사용자를 고려해서 Message Queue에 메시지를 넣고 컨슈밍해서 여러 모듈로 나눠서 서비스하고 있었다.
(전에 비동기 처리를 위해서라고 작성했지만 비동기는 비동기이지만 메시지 큐를 사용하는 실질적인 이유는 여러 서버들로 나눠서 서비스를 구현하기 위해서다.)
메시지 큐(Message Queue)란?
우선 큐(queue)는 자료구조론을 공부해본 사람이라면 한 번쯤은 들어봤을 자료구조이다.
일면 FIFO(First In First Out) 방식으로 데이터를 처리하는 자료구조인데 그림을 그려보면 아래와 같다.
양 쪽이 뚫린 원통이 있다고 생각하고 그 안에 데이터를 하나 하나 넣고 반대쪽에서 꺼내서 처리한다고 생각하면 된다.
AMQP 기반의 메시지 큐 동작 방식
메시지 큐가 동작하는 방식에 대해서는 프로토콜마다 다르지만 여기서는 MQ 오픈 소스 프로토콜인 AMQP를 기반으로 정리해보겠다.
메시지 큐의 경우는 위의 큐 자료구조를 활용해 큐에 메시지를 쌓는다고 보면된다.
메시지를 큐에 send 하는 작업하는 곳을 Producer(프로듀서)라고 하고 큐에서 메시지를 꺼내는 곳을 Consumer(컨슈머)라고 한다.
그래서 메시지를 큐에서 커내는 것을 Consuming(컨슈밍)이라고 한다.
이 프로듀서와 컨슈머는 큐당 하나 씩만 있는 것이 아니라 하나의 큐에 여러 개의 프로듀서와 컨슈머가 연결될 수 있다.
컨슈머는 큐에 메시지가 들어오면 바로 해당 메시지를 받아서 처리한다.
컨슈머는 이벤트 리스너라고 생각하면 이해가 쉽다.
좀더 세밀하게 들어가면 프로듀서가 큐에 메시지를 넣는 것은 아니다.
프로듀서가 큐에 메시지를 전송하면 Exchange라는 것이 해당 메시지를 받아서 메시지를 큐에 넣는 규칙인 Binding(바인딩) 규칙에 따라서 큐에 메시지를 넣는다. 이 행위를 publish라고 한다. 그리고 반대로 컨슈머가 메시지를 받는 것을 subscribe라고 한다.
Exchange의 바인딩 규칙은 어떤 exchange를 사용하느냐에 따라 다르다.
여하튼 Exchange는 아래와 같이 바인딩 규칙에 따라 큐에 연결된 여러 컨슈머에 메시지를 나눠서 보내준다.
컨슈머 개수 설정 및 컨슈머에서 한 번에 받을 메시지 개수 및 바인딩 규칙을 통해서 큐에 들어간 여러 메시지들을 비동기 적으로 처리할 수 있다.
이 밖에도 바인딩 규칙에 사용되는 라우팅 키, connection 내부에 생기는 가상의 연결인 channel 등 메시지 큐를 다뤄야할 때 알아야하는 것들이 더 있지만 이것은 실제 사용하고 로직이 돌아가는 것을 봐야지 좀 더 이해가 가므로 추후 RabbitMQ를 다뤄보면서 정리해봐야겠다.
AMQP 메시지 큐에 대해 정리하자면...
1. 프로듀서(Produser)가 Exchange에 메시지를 보내면(publish) Exchange는 정해진 바인딩 규칙에 따라서 적절한 큐에 메시지를 넣는다.
2. 메시지 큐에 메시지가 들어가면 대기하고 있던 컨슈머(Consumer)가 메시지를 받아서 처리한다.(subscribe)
이렇게 매시지 큐에 메시지를 publish하고 subscribe 하는 것을 도와주는 브로커가 있다. 실제 메시지 큐를 사용할 떄 이러한 브로커들을 이용해서 메시지 큐를 사용하고 컨슈머를 여러 개 만들어서 비동기로 시스템을 처리한다.
브로커의 대표적인 예로는 RabbitMQ와 Apache Kafka가 있다.
'MQ' 카테고리의 다른 글
AMQP Exchange 종류 (0) | 2021.09.10 |
---|
- Total
- Today
- Yesterday
- Spring
- 역직렬화
- 공간데이터
- ssh
- 캐시
- enum
- 스프링부트
- Caching
- Intellij
- mockito
- JPA
- DB
- 자바
- eclipse
- 데이터베이스
- k8s
- 캐싱
- 이클립스
- 메시지큐
- Java
- PostgreSQL
- DATABASE
- postgres
- cache
- rabbitmq
- HttpClient
- annotation
- MAC
- springboot
- 어노테이션
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |