MSA
요즘 MSA가 대두되면서 Kafka, RabbitMQ, ActiveMQ 등 메시징 시스템도 함께 떠오른다.
MSA에서는 시스템 간 호출이 많기 때문에 서비스간 결합도를 낮추기 위해서 + 비동기 요청, 성능, 안정성 등 여러가지 이점이 있어서 메시징 시스템을 많이 사용하게 된다.
이 글에서는 MSA에서의 전반적인 메시징 시스템에 대해 다룬다.
용어
- MOM (Message Oriented Middleware, 메시지 지향 미들웨어)
- 독립된 애플리케이션 간 데이터를 주고받을 수 있는 설계
- 함수 호출, 메모리 공유가 아닌 메시지 교환을 이용하는 중간 계층 Infra Architecture
- 분산 컴퓨팅이 가능해지며, 서비스간의 결합도가 낮아진다.
- 비동기로 메시지를 전달한다.
- Queue, Broadcast, Multicast 등의 방식으로 메시지를 전달한다.
- Pub/Sub 구조
- 메시지를 발행하는 Publisher(Producer), 메시지를 구독하고 받아서 처리하는 Subscribe(Consumer)로 구성된다.
- 메시지를 발행하는 Publisher(Producer), 메시지를 구독하고 받아서 처리하는 Subscribe(Consumer)로 구성된다.
- 독립된 애플리케이션 간 데이터를 주고받을 수 있는 설계
- Message Broker
- 메시지 처리 또는 수신자에게 메시지를 전달하는 시스템이며, 일반적으로 MOM을 기반으로 구축된다.
- MQ (Message Queue, 메시지 큐)
- Message Broker와 MOM을 구현한 소프트웨어 (Kafka, RabbitMQ, ActiveMQ, ...)
- MOM은 메시지 전송을 보장해야 하므로 AMQP를 구현한다.
- AMQP
- 메시지를 안정적으로 주고받기 위한 프로토콜
소프트웨어 RabbitMQ, Kafka 등은 'AMQP를 구현한 MOM 시스템'이라고 생각하면 된다.
물론 설계나 처리방식에 따라 장단점이 존재한다.
Messaging system
아래는 메시징 시스템을 잘 표현한 그림이다.
MSA에서 각 서비스를 Microservice단위로 분리한다.
그리고, 요청을 중앙에서 Messaging system(ex. kafka)가 메시지 형태로 받습니다. 예를 들면, "Member:Regist:01" 형태의 메시지를 받는 것이다.
MemberService에서는 Kafka를 구독(Subscribe)하고 있다가, "Member"로 시작하는 메시지가 있으면 가지고 온다.
그 후, "Regist"라는 단어를 보고 '회원가입 요청이구나'를 알고 처리를 하게 되는 것이다.
이런 구조를 Publish/Subscribe 또는 Producer/Consumer 라고 한다.
장단점
- 장점
- 서비스간의 결합도가 낮아지므로 비즈니스 로직에만 집중할 수 있다.
- 메시지 처리 방식은 Message Broker가 담당하고 각 서비스는 메시지만 보내면 된다.
- 각 서비스가 비동기 방식으로 메시지를 보내기만 하면, Message Broker에서 순서 보장(Queue)과 메시지 전송을 보장한다.
- 단점
- Message broker 운영을 위한 자원 더 소모된다.
- 시스템이 복잡하여 관리가 어렵다.
- 호출 구간이 늘어나므로 신뢰성이 떨어지고 네트워크 비용이 추가로 발생한다.
추가적으로 RPC(Remote Prodcedure call)를 사용해서 원격으로 함수를 호출하는 방법과 Messaging 시스템을 비교하는 좋은 글이 있는데 참고하면 좋을 것 같다.
https://particular.net/blog/rpc-vs-messaging-which-is-faster
Reference1: https://www.techartifact.com/blogs/tag/distributed-messaging-system
Reference2: https://victorydntmd.tistory.com/343
'Operation > System Architecture' 카테고리의 다른 글
카프카란 무엇인가? (+카프카 구성요소) (0) | 2022.05.17 |
---|---|
다중 서버에서 Session 관리하는 방법! (Multi-server session) (0) | 2022.04.21 |
대규모 서비스 - CDN을 사용하는 이유 (0) | 2022.02.26 |
Cron vs Event scheduler 장단점 정리! (0) | 2022.01.22 |
대규모 서비스 - I/O 부하 (느려졌다고 무조건 서버 증설? No!) (0) | 2021.12.25 |