메시징 및 이벤트 시스템
메시징과 이벤트 기반 아키텍처가 어떻게 느슨하게 결합된 확장 가능한 백엔드 통신을 가능하게 하는지 알아보세요.
메시징 시스템이 존재하는 이유
메시징 시스템은 서비스가 직접 호출하는 대신 브로커를 통해 비동기적으로 통신할 수 있게 하여 결합도를 낮춥니다.
- 서비스 간 직접 호출은 시스템 간에 강한 의존성을 만듭니다.
- 메시징은 생산자와 소비자를 분리하는 브로커를 도입합니다.
- 서비스는 서로를 기다리지 않고 비동기적으로 통신할 수 있습니다.
상세정보
전통적인 시스템에서는 한 서비스가 작업을 완료하기 위해 다른 서비스를 직접 호출합니다. 이는 강한 결합을 만듭니다. 한 서비스가 느리거나, 사용할 수 없거나, 과부하 상태이면 호출자에게 직접적인 영향을 줍니다.
메시징 시스템은 서비스 사이에 메시지 브로커를 두어 이 문제를 해결합니다. 다른 서비스를 직접 호출하는 대신, 서비스는 브로커에 메시지를 보내고 수신 서비스는 이를 독립적으로 처리합니다.
이렇게 하면 비동기 통신이 가능해집니다. 송신자는 수신자가 처리를 끝낼 때까지 기다릴 필요가 없으므로 시스템의 응답성과 복원력이 향상됩니다.
서비스를 분리함으로써 메시징 시스템은 전체 시스템을 깨뜨리지 않고도 개별 구성 요소를 더 쉽게 확장, 유지보수, 발전시킬 수 있게 합니다.
메시지 큐
메시지 큐는 소비자가 처리할 준비가 될 때까지 작업을 저장하여 비동기 통신을 가능하게 합니다.
- 프로듀서는 다른 서비스를 직접 호출하는 대신 메시지를 큐로 보냅니다.
- 큐는 소비자가 메시지를 처리할 때까지 메시지를 보관합니다.
- 이를 통해 비동기 처리가 가능해지고 시스템 구성 요소가 서로 분리됩니다.
상세정보
메시지 큐는 프로듀서와 소비자 사이의 버퍼 역할을 합니다. 즉시 처리를 요구하는 대신, 소비자가 처리할 수 있을 때까지 메시지를 큐에 저장합니다.
이를 통해 시스템은 작업을 비동기적으로 처리할 수 있습니다. 예를 들어, 웹 요청은 작업이 완료될 때까지 기다리지 않고도 이메일 전송 같은 작업을 빠르게 큐에 넣을 수 있습니다.
큐는 신뢰성도 향상시킵니다. 소비자가 실패하거나 일시적으로 사용할 수 없는 경우에도 메시지는 큐에 남아 있다가 나중에 처리될 수 있습니다.
프로듀서와 소비자를 분리함으로써 메시지 큐는 시스템 의존성을 줄이고 각 구성 요소가 독립적으로 확장될 수 있게 합니다.
게시 / 구독 (Pub/Sub)
Pub/Sub는 서로 직접 연결되지 않은 여러 소비자에게 하나의 이벤트를 배포할 수 있게 해줍니다.
- 발행자는 특정 소비자를 직접 지정하는 대신 토픽에 메시지를 보냅니다.
- 여러 구독자가 동일한 이벤트를 동시에 받습니다.
- 이 패턴은 이벤트 브로드캐스팅과 느슨한 결합을 지원합니다.
상세정보
게시/구독 모델에서 발행자는 특정 소비자에게 직접 보내는 대신 토픽에 메시지를 보냅니다.
소비자는 해당 토픽을 구독하고, 그 토픽에 게시된 모든 메시지를 자동으로 받습니다. 이를 통해 하나의 이벤트가 시스템 전반에서 여러 개의 독립적인 작업을 트리거할 수 있습니다.
예를 들어, 사용자가 가입하면 하나의 이벤트로 이메일, 분석, 결제, 알림과 같은 여러 서비스에 동시에 알릴 수 있으며, 발행자는 이 서비스들을 알 필요가 없습니다.
이 모델은 생산자와 소비자를 분리하고 시스템을 더 쉽게 확장할 수 있게 합니다. 새 구독자는 발행자를 변경하지 않고도 추가하거나 제거할 수 있어 유연성과 확장성이 향상됩니다.
Pub/Sub는 시스템이 직접적이고 동기적인 통신에 의존하지 않고 이벤트에 반응하는 이벤트 기반 아키텍처에서 널리 사용됩니다.
이벤트 기반 시스템
이벤트 기반 시스템은 서비스가 이벤트를 발생시키고 이에 반응함으로써 서로 통신할 수 있게 하며, 구성 요소 간의 직접적인 의존성을 줄입니다.
- 서비스는 다른 서비스를 직접 호출하는 대신 이벤트(예: "User Created")를 발생시킵니다.
- 여러 개의 독립적인 서비스가 조정 없이 같은 이벤트에 반응할 수 있습니다.
- 이렇게 하면 시스템의 결합도가 낮아져, 각 서비스가 독립적으로 확장되고 발전할 수 있습니다.
상세정보
이벤트 기반 시스템에서는 직접적인 서비스 호출 대신 이벤트에 의해 작업이 트리거됩니다. 새 사용자가 가입하는 것처럼 어떤 일이 발생하면, 시스템은 그 변경 사항을 설명하는 이벤트를 발생시킵니다.
이 이벤트는 메시지 브로커를 통해 전달되며, 여러 서비스가 이를 구독하고 반응할 수 있습니다. 예를 들어, 하나의 "User Created" 이벤트가 이메일 서비스로 하여금 환영 메시지를 보내게 하고, 분석 서비스가 사용자 증가를 추적하게 하며, 결제 서비스가 계정을 초기화하도록 할 수 있습니다.
기존의 요청-응답 시스템과 달리, 이벤트를 생성한 쪽은 어떤 서비스가 이를 소비할지 알 필요가 없습니다. 이로 인해 강한 결합이 사라지고, 다른 서비스에 영향을 주지 않으면서 서비스를 추가, 제거 또는 수정할 수 있습니다.
이 아키텍처는 각 서비스가 자신의 속도에 맞춰 이벤트를 처리할 수 있기 때문에 확장성을 향상시킵니다. 또한 복원력도 높여 줍니다. 하나의 서비스가 실패하더라도 다른 서비스는 차단되지 않고 계속 동작할 수 있습니다.
하지만 이벤트 기반 시스템은 이벤트 순서 처리, 중복 처리, 그리고 서비스 간 최종 일관성 같은 복잡성을 도입합니다.
이벤트 소싱
이벤트 소싱은 모든 변경 사항을 이벤트로 저장하여, 시스템 상태를 언제든지 다시 구성할 수 있게 합니다.
- 현재 상태만 저장하는 대신, 시스템은 이벤트의 시퀀스를 저장합니다.
- 현재 상태는 이벤트를 순서대로 다시 재생하여 도출됩니다.
- 이를 통해 감사 가능성, 이력 추적, 재현 가능한 시스템 상태를 구현할 수 있습니다.
상세정보
전통적인 시스템에서는 데이터베이스가 데이터의 최신 상태만 저장합니다. 이벤트 소싱은 모든 변경 사항을 append-only 로그의 이벤트로 저장하는 다른 접근 방식을 사용합니다.
예를 들어, 현재 사용자 프로필만 저장하는 대신 시스템은 "UserCreated", "EmailUpdated", "PasswordChanged" 같은 이벤트를 기록합니다. 이러한 이벤트는 변경 이력 전체를 나타냅니다.
현재 상태는 이러한 이벤트를 순서대로 다시 재생하여 재구성됩니다. 이를 통해 시스템은 특정 시점의 상태를 다시 만들 수 있으며, 디버깅, 감사, 분석에 유용합니다.
이 접근 방식은 강력한 추적 가능성을 제공하고 시스템이 현재 상태에 정확히 어떻게 도달했는지 이해할 수 있게 해주지만, 저장 및 처리 측면에서 추가적인 복잡성을 도입합니다.
메시지 브로커
메시지 브로커는 서비스 간에 메시지가 저장, 라우팅, 전달되는 방식을 관리하는 중개자 역할을 합니다.
- 메시지 브로커는 프로듀서로부터 메시지를 받아 컨슈머에게 전달합니다.
- 신뢰할 수 있는 전달과 메시지 영속성 같은 보장을 제공합니다.
- 메시지가 올바른 컨슈머에게 도달하도록 라우팅 로직을 처리합니다.
상세정보
메시지 브로커는 프로듀서와 컨슈머 사이에 위치하며, 메시지 흐름을 관리하는 중앙 시스템 역할을 합니다.
프로듀서가 메시지를 보내면 브로커가 이를 저장하고 적절한 컨슈머에게 전달되도록 보장합니다. 이를 통해 서비스들이 서로 직접 통신할 필요가 없어집니다.
메시지 브로커는 전달 보장도 제공합니다. 시스템에 따라 메시지는 데이터 손실을 방지하기 위해 디스크에 영속화될 수 있으며, 전달에 실패하면 재시도될 수 있습니다.
또한 어떤 컨슈머가 어떤 메시지를 받아야 하는지 결정하는 라우팅도 처리합니다. 여기에는 단순한 큐 기반 전달이나 pub/sub 토픽 같은 더 복잡한 패턴이 포함될 수 있습니다.
이러한 책임을 중앙에서 처리함으로써 메시지 브로커는 통신을 단순화하고 분산 시스템을 더 안정적이고 확장 가능하게 만듭니다.
일반적인 메시징 기술
서로 다른 메시징 시스템은 서로 다른 성능, 신뢰성, 아키텍처 요구사항을 충족하도록 설계됩니다.
- Kafka는 높은 처리량의 이벤트 스트리밍과 영속적인 로그를 위해 만들어졌습니다.
- RabbitMQ는 신뢰할 수 있는 메시지 전달과 유연한 라우팅에 중점을 둡니다.
- NATS는 마이크로서비스에서 낮은 지연 시간의 통신에 최적화되어 있습니다.
상세정보
Kafka는 대량의 데이터를 처리하도록 설계된 분산 이벤트 스트리밍 플랫폼입니다. 메시지를 영속적인 로그에 저장하고 소비자가 이벤트를 다시 재생할 수 있게 해주므로, 분석 파이프라인과 이벤트 기반 시스템에 적합합니다.
RabbitMQ는 큐와 복잡한 라우팅 패턴을 지원하는 전통적인 메시지 브로커입니다. 신뢰할 수 있는 전달에 중점을 두며, 백그라운드 작업 처리와 태스크 큐에 흔히 사용됩니다.
NATS는 단순성과 속도를 위해 설계된 경량 메시징 시스템입니다. 매우 낮은 지연 시간의 통신을 제공하며, 빠른 메시지 전달이 중요한 마이크로서비스 아키텍처에서 자주 사용됩니다.
각 시스템에는 서로 다른 장단점이 있습니다. Kafka는 처리량과 내구성을 우선시하고, RabbitMQ는 유연성과 신뢰성을 강조하며, NATS는 속도와 단순성에 중점을 둡니다. 올바른 도구를 선택하는 것은 시스템의 요구사항에 따라 달라집니다.
분산 시스템에서의 메시징
메시징 시스템은 분산 서비스 간의 통신을 조정하면서도, 각 서비스를 독립적이고 확장 가능하게 유지합니다.
- 서비스는 직접 연결 대신 브로커를 통해 통신합니다.
- 메시징은 메시지를 버퍼링하고 재시도함으로써 장애 허용성을 향상시킵니다.
- 이는 여러 독립적인 서비스 전반에서 확장 가능한 통신을 가능하게 합니다.
상세정보
분산 시스템에서는 여러 서비스가 독립적으로, 그리고 종종 서로 다른 머신에서 실행됩니다. 이들 간의 통신을 조정하는 것은 큰 과제가 됩니다.
메시징 시스템은 메시지 브로커를 중앙 통신 계층으로 도입하여 이 문제를 해결합니다. 서비스는 서로를 직접 호출하는 대신 브로커를 통해 이벤트를 보내고 받습니다.
이러한 느슨한 결합은 장애 허용성을 향상시킵니다. 어떤 서비스가 일시적으로 사용할 수 없더라도, 메시지는 시스템 안에 남아 있다가 나중에 다른 서비스들을 막지 않고 처리될 수 있습니다.
또한 확장성도 향상됩니다. 기존 서비스를 수정하지 않고도 이벤트를 소비하는 새 서비스를 추가할 수 있어, 시스템이 강한 의존성 없이 성장할 수 있습니다.
그 결과, 메시징 시스템은 현대 분산 아키텍처의 핵심 구성 요소가 되었으며, 유연하고 복원력 있으며 확장 가능한 시스템 설계를 가능하게 합니다.
질문 섹션
1 / 5
이 레슨은 프리미엄 콘텐츠입니다
프리미엄으로 업그레이드하여 흐림 효과를 없애고 전체 내용을 읽어 보세요.