RabbitMQ 학습 목적으로 전체 내용은
링크된 RabbitMQ in Depth - 에이콘 출판 도서를 참고하여
글을 작성하였습니다
"RabbitMQ는 메시지 브로커" 입니다. 분산 소프트웨어 아키텍처를 만들기 위해 사용합니다
1. 다양한 클라이언트 라이브러리를 제공합니다
다수의 프로그래밍 언어와 플랫폼에서 클라이언트 라이브러리가 제공됩니다
서로 다른 언어와 운영체제 환경에 RabbitMQ 메시지 브로커를 이용하여 데이터를 공유할 수 있습니다
2. 유연한 성능과 안정성 절충이 가능합니다
메시지 디스크 저장 설정도 할 수 있어 메시지 영속성을 보장할 수 있습니다.
클러스터를 설정할 때는 큐를 고가용성으로 설정하여
메시지를 여러 노드에 저장하면 일부 서버 장애로 메시지가 손실되지 않도록 처리할 수 있습니다
3. 경량성
관리자 UI 플러그인과 코어 애플리케이션을 구동하는데 40MB 미만의 메모리를 사용합니다.
다만, 큐에 전송되는 메시지양이 증가하면 메모리 사용량은 증가됩니다
4. 대기 시간이 긴 네트워크를 위한 플러그인
대기 시간이 짧은 네트환경에서는 기본 코어 모듈에서 제공합니다
반면 인터넷과 같이 대기 시간이 긴 네트워크 간의 메시지 전달은 플러그인을 제공합니다
5. 보안계층
RabbitMQ는 보안계층을 여러 단계로 제공합니다
클라이언트 접속 인증은 SSL로 제한합니다
가상 호스트로 사용자 접근을 관리하여 메시지와 리소스(메모리 등)를 고수준으로 격리하여 처리하고 있습니다
RabbitMQ가 만들어진 근간에는 얼랭 이라는 언어가 있습니다
RabbitMQ는 함수형 프로그래밍 언어 얼랭으로 작성되었습니다
얼랭은 99.99% 가동 시간을 요구하는 애플리케이션을 위해 설계 되었습니다
얼랭은 실시간 시스템에서 경량 프로세스(Light Weight Process) 간에 메시지를 전달하고
공유하는 상태가 없도록 설계돼 있어 높은 수준의 동시성(서로 다른 작업이 같은 시간에 동시에 처리)을 제공합니다
동시에 다수의 연결을 관리하고 메시지를 라우팅(최적의 경로로 데이터를 전송)하며
메시지 브로커 자신의 상태를 관리합니다
얼랭의 분산 아키텍처는 RabbitMQ의 클러스터링 메커니즘을 자연스럽게 구현할 수 있습니다
RabbitMQ는 얼랭의 프로세스 간 통신(IPC) 시스템을 사용하여 클러스터링 기능을 간단하게 구현하였습니다
클러스터
데이터 집단을 정의하고 집단을 대표하는 대표점을 의미합니다
IPC (Inter-process Communication)
프로세스들 사이에 데이터를 주고 받는 행위, 경로, 방법을 의미합니다
RabbitMQ 클러스터는 얼랭 VM의 네이티브 IPC 메커니즘을 사용하여
노드 간 상태 정보를 공유하며 전체 클러스터 간에 메시지를 생산하고 소비합니다.
Erlang VM 간 화살표의 의미
얼랭(Erlang VM)의 IPC 시스템을 사용하여 통신합니다
얼랭 IPC 시스템를 사용하여 메시지, 상태, 설정을 공유하며 각 서버를 동기화 합니다
얼랭 IPC 시스템은 TCP/IP를 사용하여 RabbitMQ 서버 간 통신을 처리합니다
"Erlang 환경에 익숙하지 않다면 진입 장벽이 될 수 있습니다.
운영 중에 설정 파일 관리, RabbitMQ 런타임 상태 정보 수집 방법에 대해 익히는 연습을 하면 좋습니다"
Rabbitmq in depth - 30page
RabbitMQ 검색하다 보면 AMQP 에 대한 내용이 많이 나옵니다.
이번 기회에 자세히 이해할 수 있는 시간이 될 것 같습니다
RabbitMQ는 개발 과정에서 상호운용성(Interoperability), 성능, 안정성을 중요한 목표로 개발되었습니다
AMQP 스펙을 구현한 최초 메시지 브로커 중 하나입니다
AMQP 스펙은 RabbitMQ와 통신하기 위한 프로토콜뿐 아니라
RabbitMQ 핵심 기능을 구현하기 위한 논리적인 모델의 틀도 제공하였습니다.
AMQP를 구현한 RabbitMQ는 메시지 라우팅, 메시지 내구성 설정, 데이터센터 간 통신 등
메시지 지향 아키텍처의 복잡한 요구사항에 중립적이며 플랫폼 독립적으로 사용이 가능합니다.
"애플리케이션을 개발할 때는 애플리케이션에 미치는 영향을 고려해
메시지 프로토콜과 메시지 브로커를 선택해야 합니다"
서비스에 활용되고 있는 RabbitMQ 활용사례를 예시만 조금 다르게 하여 정리해 보았습니다
사용자가 마켓이라는 플랫폼에서 상품을 주문하는 상황입니다
사용자가 마켓에서 주문을 요청합니다
실제 판매업체에 주문등록이 완료되면 애플리케이션은 DB 작업을 기다리지 않고
사용자에게 주문이 완료되었다는 응답과 함께 주문이 완료되었다는 주문상세 화면으로 이동합니다
메시지 브로커를 활용하면 판매업체로 부터 주문등록이 완료되었다는 응답을 받은 후에
메시지만 발행해주면 주문 관련 DB 작업을 수행하는 것을 기다리지 않고 바로 사용자에게 완료되었다는
응답을 전해줄 수 있습니다
여기서, 실제 DB 작업에 대해서는 발행된 메시지를 구독하고 있는 Consumer 모듈에게 전달되며
전달받은 Consumer 모듈에서 실제 주문 관련된 DB 업데이트 작업을 수행하게 되는 구조입니다
방금 설명드린 사례에서 실제 DB 작업은 메인 애플리케이션과 무관하게
Consumer Application에 의해 수행되는 것을 확인하였습니다
RabbitMQ를 이용하여 데이터베이스 의존성을 제거하여 느슨하게 결합된 구조가 될 수 있었습니다
RabbitMQ를 활용 예시와 같은 구조의 애플리케이션은
1. 데이터베이스의 삽입, 변경 등에 대한 DB 성능에 영향을 받지 않으며
2. 애플리케이션 코드를 변경하지 않고도 데이터를 처리하는 애플리케이션을 쉽게 추가할 수 있습니다 (확장성)
아래 3가지 개념은 실제 코드 상에서 구현되는 개념으로
의미와 역할들이 무엇인지 정리하였습니다
1. Exchange
RabbitMQ 에서 메시지를 목적지로 전달하기 위해 필요합니다
전송한 메시지를 수신하고 메시지를 보낼 위치를 결정하는 역할을 합니다
Exchange는 메시지에 적용할 라우팅 동작을 정의합니다.
(메시지가 보내질 때 데이터의 속성, 메시지에 포함된 속성을 이용합니다)
2. Queue
수신한 메시지들을 저장하는 역할을 하고 있습니다
Queue 설정 정보에는 메시지를 메모리에만 보관할 것인지
디스크에 보관할 것인지에 대한 정보가 포함되어 있습니다
수신한 메시지의 처리순서는 Queue 자료구조의 특징 선입 선출 방식으로 처리됩니다
3. Binding
AMQ 모델은 바인딩을 사용해서 큐와 익스체인지 관계를 정의합니다
바인딩 키와 익스체인지는 어떤 큐에 메시지를 전달해야 하는지를 의미합니다
익스체인지에 메시지를 발행할 때 애플리케이션은 라우팅키 속성을 사용합니다
라우팅 키는 큐의 이름이거나 의미적으로 메시지를 설명하는 문자열입니다
대규모 데이터 부하 분산 위한 계측 방법 (병목 현상, Load Average, vmstat) (1) | 2024.01.14 |
---|---|
단방향 연관관계 (객체 참조, 테이블 외래키) 방법 (1) | 2024.01.13 |
기본적인 SQL 튜닝 학습하기 (0) | 2022.02.23 |
Kafka 이벤트 스트리밍 이해하기 (0) | 2021.10.24 |
Database, DBMS (0) | 2020.03.11 |
댓글 영역