반응형
지난번 글에서 RabbitMq의 기본개념에 대해 알아보았다. 추상적으로 밖에 이해가 안가서 다시 여러 글을 읽고 Spring Java를 이용하여 구현하여 보았다.

지난번 포스트에서 추가로 부연된 설명을 하고자 한다.

보통의 웹 어플리케이션이 직접 서버로 연결한 서버-클라이언트 관계라면
메세지 큐를 중간에 위치시킴으로서 라우터 역할을 수행한다.

메세지큐에게 메세지 전송을 모두위임하고 애플리케이션과 서버는 느슨한 관계를 유지할 수 있다.

느슨하게 결합된 시스템 구성의 장점은

1) 발행자 또는 소비자 간 문제 발생 시 서로 영향을 주지 않는다.
2) 각 시스템의 성능은 다른 측면에 영향을 미치지 않는다.
3) 발행자와 소비자의 인스턴스 수는 작업량을 수용할 수 있을 만큼 독립적으로 증가하고 감소한다.
4) 발행자는 소비자의, 소비자는 발행자의 위치가 어디인지 혹은 어떤 기술을 사용하는지 알지 못한다.





AMQP(Advanced Message Queuing Protocol) : 시스템 간 메시지를 교환하기 위해 공개 표준으로 정의한 프로토콜
Broker : 발행자가 만든 메시지를 저장
Virtual host : Broker 내의 가상 영역
Connection : 발생자와 소비자, Broker 사이의 물리적인 연결
Channel : 발행자와 소비자, Broker 사이의 논리적인 연결, 하나의 Connection 내에 다수의 Channel 설정 가능
Exchange : 발행한 모든 메시지가 처음 도달하는 지점으로 메시지가 목적지에 도달할 수 있도록 라우팅 규칙 적용, 라우팅 규칙에는 direct, topic, fanout
Queue : 메시지가 소비되기 전 대기하고 있는 최종 지점으로 Exchange 라우팅 규칙에 의해 단일 메시지가 복사되거나 다수의 큐에 도달할 수 있다
Binding : Exchange 와 Queue 간의 가상 연결

AMQP 모델에는 메세지 확인 개념이 있다. 메세지가 소비자에게 전달되면 Broker에서 알린다. 메세지 확인이 되면 브로커는 큐에서 메세지를 완전히 제거. 

중요한 개념이 Exchange이다. 발행자에게 수신한 메세지를 큐에 적절히 분배하는 라우터 기능을 한다. 각 Exchange와 큐는 가상으로 연결되어있고 이 바인딩 규칙에 따라 큐에 라우팅하는데 그것이 바로 Exchange 타입이다.


지난번 post에서는 조금 어렵게 설명해놓았는데 Exchange type을 다시 설명하려고 한다.

1) Direct Type - 라우팅키와 바인딩키가 완벽하게 일치해야 하는경우 -- 경우에 따라서 멀티 바인딩도 가능하다.




2) Fanout Type - 바운딩되어있는 모든 큐에 메세지를 전송한다. 바인딩, 라우팅키에 상관없이 



3) Topic Type - *와 # 사용 , *는 한개의 단어만 가능 #은 여러개의 단어가 가능
에를들어 rabbit.orange.queue라는 키는 Q1에만 가능 - * 자리에 한개의 단어만 사용하므로
또한 lazy.a.b.c...는 Q2에 가능 - 여러개의 단어가 연이어나와도 #이면 가능하다








즉, Topic type은 *가 오느냐 #가 오느냐에 따라  Fanout Type이 될수도 있고  Direct Type이 될수도 있다.









참조 블로그에 더 자세하게 나와있다.
https://brunch.co.kr/@springboot/6


반응형

'개발공부 > RabbitMq' 카테고리의 다른 글

RabbitMQ 기본 개념, AMQP의 정의  (0) 2018.06.08
반응형

Producer(생산자)가 Message를 Queue에 넣어두면, Consumer가 Message를 가져와 처리하는 방식입니다.

굳이 이런 시스템이 필요할까..? 한번 더 거치게 되면 더 느려지는게 아닌가? 라는 의문이 들 수 있습니다. 위에서도 언급한바 있지만 다시 한번 말씀드리자면, Client와 동기방식으로 많은 데이터 통신을 하게 되면 병목현상이 생기게되고, 서버의 성능이 저하됩니다. 이런 현상을 막고자하여 또 하나의 미들웨어에 메시지를 위임하여 순차적으로 처리를 하는 것 입니다.



일반적으로 메시징 시스템이나 RabbitMQ 에서 사용하는 컴퓨터 용어

Producing : 메시지를 전송한다는 의미
producer : 메시지들을 전송하는 프로그램을 producer 라 부릅니다. 
Queue: mailbox를 의미하며 RabbitMQ 시스템 내에 위치. consumer 대신에 RabbitMQ가 보관하는 메시지 버퍼
외부연동 서버에서 이 비동기 처리를 쉽게 구현하기 위하여 MQ(Message Queuing)를 사용한다.


AMQP

인스턴스가 데이터를 서로 교환할 때 사용하는 방법
MQ를 오픈 소스에 기반한 표준 프로토콜이 AMQP(Advanced Message Queuing Protocol)이다.
AMQP 자체가 프로토콜을 의미하기 때문에 이 프로토콜을 구현한 MQ제품들은 여러가지가 있으며 그 중 하나가 RabbitMQ이다.

AMQP의 구성요소와 라우팅 알고리즘

Exchange : Publisher(Producer)로부터 수신한 메시지를 큐에 분배하는 라우터의 역할
Queue : 메시지를 메모리나 디스크에 저장했다가 Consumer에게 메시지를 전달하는 역할
Binding : Exchange Queue의 관계를 정의

 Exchange Type 
 메시지를 어떠한 방법으로 라우팅할지 결정하는 일종의 알고리즘

1) Direct exchange
1:1 관계로 Unicast 방식에 적합, 운드 로빈 방식으로 여러 workers(Consumer) task를 분리
Exchange에 바인딩 된 Queue 중에서 메시지의 라우팅 키와 매핑되어 있는 Queue로 메시지를 전달한다

2) Fanout exchange
메시지의 라우팅 키를 무시하고 Exchange에 바인딩 된 모든 Queue에 메시지를 전달한다
1:N 관계로 메시지를 브로드캐스트하는 용도로 사용된다.

3) Topic exchange

Exchange에 바인딩 된 Queue 중에서 메시지의 라우팅 키가 패턴에 맞는 Queue에게 모두 메시지를 전달, Multicast 방식에 적합하다.


4) Headers exchange
라우팅 키 대신 메시지 헤더에 여러 속성들을 더해 속성들이 매칭되는 큐에 메시지를 전달한다.

RabbitMQ AMQP를 구현한 오픈 소스 메시지 브로커 소프트웨어로 Publisher(Producer)로부터 메시지를 받아 Consumer에게 라우트하는 것이 주된 역할이다이를 이용하면 작업 큐발행 및 구독라우팅주제원격 프로시저 호출 등의 모델을 구현할 수 있으며이 글에서는 작업 큐를 구현하는 방법을 다룬다.

RabbitMQ의  Exchange Type 

RabbitMQ AMQP를 구현하였기 때문에 아래의 표와 같이 Exchange Type이 미리 선언된 이름으로 정의되어 있다참고로 작업 큐는 Direct exchange가 적합하다

1) Direct exchange - (Empty string) and amq.direct
 참고) AMQP 정의 : 바인딩 된 Queue 중에서 메시지의 라우팅 키와 매핑되어 있는 Queue로 메시지를 전달(1:1)
2) Fanout exchange - amq.fanout
 참고) AMQP 정의 : 메시지의 라우팅 키를 무시하고 Exchange에 바인딩 된 모든 Queue에 메시지를 전달(1:N)
3) Topic exchange -amq.topic
 참고) AMQP 정의 : Exchange에 바인딩 된 Queue 중에서 메시지의 라우팅 키가 패턴에 맞는 Queue에게 모두 메시지를 전달(Multicast)
4) Headers exchange - amq.match (and amq.headers in RabbitMQ)
 참고) AMQP 정의 : 라우팅 키 대신 메시지 헤더에 여러 속성들을 더해 속성들이 매칭되는 큐에 메시지를 전달

https://www.evernote.com/shard/s479/sh/ddbec3f0-84fd-45c6-87d7-952a672341f1/ce289238f23c99a9b2e1a45b41c770a9
출처: http://itstory.tk/entry/Message-Queue-RabbitMQ란 [덕's IT Story]
출처: http://heowc.tistory.com/35 [허원철의 개발 블로그]
출처: https://m.blog.naver.com/tmondev/220419853534


반응형

'개발공부 > RabbitMq' 카테고리의 다른 글

RabbitMq(2)  (0) 2018.07.11

+ Recent posts