- 메시지 큐잉 (message queuing) : 애플리케이션이나 느슨하게 결합된 시스템 구성 요소 간 통신 방식 또는 메시징 이라고 부른다.
- AMQP (Advanced Message Queuing Protocol) : 상호 정보 교환이 가능한 메시징 프로토콜의 의미를 정의한 명세서
RabbitMQ는 AMQP를 Erlang 기반으로 구현한것이다.
- 가장 흔한 요청-응답 방식은 클라리언트 시스템이 원격 서버 시스템에 노출된 통신 지점과 동기 방식으로 상호작용한다.
시스템이 원격지 서버로 메시지를 전송하고, 상대방이 응답할 때까지 기다리는 방식은 원격 프로시저 호출이나 웹 서비스 호출 또는 리소스 소비 형태와 별반 다르지 않다. 시스템은 각 지점 사이에서 포인트 투 포인트 방식으로 정보를 주고받는다.
두 지점간의 견고한 결합은 전체 시스템 구조를 변경하거나 발전시키는데 어려움을 준다.
그림에서 보다시피 단방향 방식의 경우 시스템 간에는 비동기 방식으로 메시지를 송신하다. 이때 보통 메시지 브로커라는 두 지점을 연결하는 중개자를 통한다.
일반적으로 메시징이나 메시지 큐로 불리는 이 방식에서 시스템은 발행자는 대상 시스템에 메시지 송신이 필요하면 브로케에게 메시지를 전달한다.
따라서 응답이 필요한 경우에는 동일한 방식으로 발행자와 소비자의 역할만 뒤바꿔서 메시지를 전달한다.
이 시스템은 다음과 같은 특징을 같고있다.
1. 발행자 또는 소비자 간 문제 발생 시 서로 영향을 주지 않는다.
2. 각 시스템의 성능은 다른 측면에 영향을 미치지 않는다.
3. 발행자와 소비자의 인스턴스 수는 작업량을 수용할 수 있을 만큼 독립적을 ㅗ증가하고 감소한다.
4. 발행자는 소비자의, 소비자는 발행자의 위치가 어디인지 혹은 어떤 기술을 사용하는지 알지 못한다.
이와 같은 접근법의 치명적인 단점은 프로그래머가 어떤 일들이 연달아 발생할 경우 절차적 프로그래밍 모델을 따를 수 없다는 것이다. 메시징 시스템에 서는 시간의 흐름에 따라 특정 상황이 발생하므로 시스템이 이를 처리할 수 있도록 프로그래밍되어야 한다.
SMTP(Simple Mail Transfer Protocol)을 살펴보자
1. SMTP서버로 이메일을 보낸다.
2. 처음 이메일을 받은 서버는 이를 저장하고 다음 SMTP 서버로 전달한다.
3. 수신자의 이메일 서버에 도달할 때까지 이러한 작업을 반복한다.
4. 수신자는 받은 편지함에 대기 상태로 있는 메시지를 POP3 또는 IMAP등을 사용해서 꺼내볼수있다.
- POP3(Post Office Protocol) : 클라이언트가 메일을 다운로드할 수 있도록 하는 프로토콜을 말한다.
- IMAP(Internet Message Access Protocol) : 인터넷 메일 서버에서 메일을 읽기 위한 프로토콜을 말한다. POP3 보다 유연하다.
SMTP를 이용하면 발행자는 이메일이 언제 도착할지, 그리고 무사히 도착했는지 알 수 있는 방법이 없고, 이메일 전달이 실패하는 시점에서야 비로소 알수있다. 처음에 보낸 메시지를 브로커가 성공적으로 받았는지에 대한 수신 여부뿐이다. 응답이 필요한 경우 발행자와 소비자의 역할만 뒤바뀌어 동일한 절차에 따라 비동기 방식으로 이메일을 전달할 것이다.
AMQP
진일보한 메시지 큐 프로토콜(AMQP, Advanced Message Queuing Protocol)은 시스템 간 메시지를 교환하기 위해 공개 표준으로 정의한 프로토콜이다.
발행자와 소비자, 브로커 사이에 발생하는 상호자굥 방식뿐만 아니라 메시지와 명령어의 교환 형태 또한 정의하고 있다.
메시지의 연결 형태를 명심함으로써 AMQP는 안심하고 데이터를 교환할수 있는데, 그 어떤것도 특정 업체나 호스팅 플랫폼에 종속되지 않는다.
AMQP의 핵심개념)
- 브로커(Broker) : 미들웨어 애플리케이션으로 발행자가 만든 메시지를 받을 수 도 있고 이를 소비자나 다른 브로커에게 전달할 수 있다.
- 가상 호스트(Virtual host) : 브로커 내의 가상 영역으로, 멀티테넌시 같이 대개 보안상의 이유로 발행자와 소비자, 그리고 모든 AMQP 구성 요소를 분리 할 수 있다.
여기서 멀티테넌시(multitenancy)란, 시스템에서 다수의 이용자에게 동일한 서비스를 제공하는 기술을 말한다.
- 연결(Connection) : 발행자와 소비자, 브로커 사이의 물리적인 네트워크(TCP) 연결로, 클라이언트 단절이나 네트워크 또는 브로커에 장애가 발생했을 때에만 닫힌다.
- 채널(Channel) : 발행자와 소비자, 브로커 사이의 논리적인 연결로, 하나의 연결 내에 다수의 채널을 설정할 수 있다. 채널은 특정 클라이언트와 브로커간에 간섭이 일어나지 않도록 서로 간에 상호작용을 분리시킬 수 있으며, 연결 비용이 많이 드는 개별 TCP 연결을 개방하지 않고서도 가능하다. 채널은 프로토콜 에러가 발생할 경우 닫힐 수 있다.
- 익스체인지(Exchange) : 발행한 모든 메시지가 처음 도달하는 지점으로 메시지가 목적지에 도달할 수 있도록 라우팅 규칙 적용을 담당한다. 라우팅 규칙에는 다이렉트(Direct), 토픽(Topic), 팬아웃(fanout) 기법들이 존재하며 이들은 각각 포인트 투 포인트(point-to-point), 발행-구독(publish-subscribe), 멀티캐스트(multicast)라 불린다.
- 큐(Queue) : 메시지가 소비되기 전 대기하고 있는 최종 지점으로, 익스체인지 라우틴 규칙에 의해 단일 메시지가 복사되거나 다수의 큐에 도달할 수 있다.
- 결합(Binding) : 익스체인지와 큐 간의 가상 연결로, 메시지가 익스체인지에서 큐로 이동할 수 있도록 하는 역할을 담당한다. 익스체인지 라우틴 규칙에 따라 큐를 결합하는 데 라우팅 키를 사용할 수 있다.
AMQP와 다른 프로토콜 간의 주요 차이점
- 자바 메시지(JMS) : AMQP와 달리 JMS는 메시지가 아닌 자바 프로그래밍 인터페이스를 위한 회선상의 프로토콜만을 정의한다. 따라서 JMS는 상호간에 정보 교환이 가능하지 않으며 호환 가능한 클라이언트와 브로커가 사용되는 경우에만 작동한다. 게다가 JMS는 AMQP와 다르게 벤더 고유의 접근 방식에 상당한 여지를 남겨둔다. 그러므로 각 벤더사마다 개별적으로 JMS를 정의할 수 있기 때문에 메시징 라우팅을 완전히 구성하는 데 필요한 명령어를 정의하지 않는다. 마지막으로 JMS에서 메시지 생산자는 큐나 토픽같은 ㅌ그정 지점을 목적지로 삼는데, 이는 클라이언트가 대상 토폴로지의 정보를 알고 있어야 한다는 것을 의미한다. AMQP에서 라우팅 로직은 발행자가 신경 쓰지 않도록 익스체인지 내에 캡슐화된다.
여기서 토폴로지는 컴퓨터 네트워크의 요소들(링크, 노드 등)을 물리적으로 연결해 놓은 것. 또는 그 연결 방식을 말한다.
- MQTT(Message Queue Telemetry Transport) : 초경량 메시지 큐 프로토콜로 발행-구독 방식에 초점을 두고 있다. AMQP와 마찬가지로 상호운용이 가능하며 임베디드 시스템에서 대규모 배포에 매우 적합하다. 알루러 AMQP처럼 구독 관리와 메시지 라우팅을 위해 브로커에 의존한다. RabbitMQ는 고유의 확장 기능 덕분에 MQTT 프로토콜을 사용할 수 있다.
- 제로MQ(ZeroMQ) : 중앙 집중형 브로커 없이도 메시지 의미를 전달하지만 브로커가 제공하는 영속성과 전달 보장성은 없다. 따라서 제로MQ의 핵심은 상호 운용 가능한 네트워크 라이브러리로, 다양한 언어를 지원하며 고성능 및 고가용성을 지닌 분산 시스템 구성을 위한 수단으로 활용할수 있다.
- 프로세스 수신함(process inboxes) : 얼랭이나 아카(Akka) 같은 프로그래밍 언어와 플랫폼 또한 메시지 의미를 제고앟지만 프로세스나 해우이자(actor0)같에 미시지를 분산시키기 위해 클러스터링 기술에 의존한다. 그러나 호스팅하는 애플리케이션 내에 임베디드되기 때문에 상호 운용성을 위해 설계되지는 않는다.
'WEB > RabbitMQ' 카테고리의 다른 글
Rabbitmq 설치초기 (0) | 2020.01.08 |
---|---|
4. 애플리케이션 수신함(3) (0) | 2019.12.20 |
3. 애플리케이션 수신함(2) (0) | 2019.12.14 |
2. 애플리케이션 수신함 (0) | 2019.12.14 |