2. Why Messaging?
• Get data from point A to point B
• Decouple publishers and consumers
• Queueing for later delivery
• Asynchronous
• Load balancing and scalability
3. • Message Queuing
• 프로세스 또는 프로그램 인스턴스가 데이터를 서로 교환할때 사용하
는 방법
• 데이터를 교환할때 시스템이 관리하는 메세지 큐를 이용하는 것이
특징
• 대용량 데이터를 처리하기 위한 배치 작업이나, 체팅 서비스, 비동기
데이터를 처리할때 사용
MQ
4. • Advanced Message Queueing Protocol
• http://www.amqp.org/
• Broadly applicable for enterprise
• Totally open
• Platform agnostic
• Interoperable
• Standard port is 5672/tcp
• List of brokers
AMQP
5. • RabbitMQ is an AMQP messaging broker
• Developed and maintained by Rabbit Technologies
Ltd, www.rabbitmq.com
• Joint venture between Cohesive Flexible Technologies
(www.cohesiveft.com) and LShift (www.lshift.net)
• Core development team in London, UK
• Rabbit is a part of AMQP Working Group
RabbitMQ What?
6. RabbitMQ Why?
• Robust messaging for applications
• Easy to use
• Runs on all major operating systems
• Supports a huge number of developer platforms
• Open source and commercially supported
7. • RabbitMQ is a broker written in Erlang
• RabbitMQ team alse provides Java and .NET clients
• Implements AMQP 0-8 spec
• Experimental products include AMQP-over-HTTP +
Javascript libraries, Erlang client, gateway for STOMP
clients, XMPP (Jabber) gateway
RabbitMQ
8. 1. 설치
• Erlang 설치
• Rabbit MQ 다운로드 후 설치
2. 기본 명령
• 서버 기동 : sbin/rabbitmq-server start. 윈도우즈에서는 services.msc에서
서비스로 시작
• 상태 체크 : sbin/rabbitmqctl status
• 서버 중지 : sbin/rabbitmqctl stop
RabbitMQ
9. 3. Web Admin 모듈
• web admin 모듈 enable - "rabbitmq-plugins enable
• rabbitmq_management" (이 다음 서비스를 restart해야 함)
• http://localhost:15672/ 접속후 guest/guest로 로그인
RabbitMQ
10. RabbitMQ
• Producer(메시지를 삽입하는 프로그램)을 P로, Consumer(큐에서 메시지를 꺼내는 프로그램)은 C으로 표기
• 실제로는 P 가 여러 개로 생각함 (이하 그림 동일)
• C가 1개이므로 작업(메시지 처리)가 분산되지 않아, 실제로 사용할 일은 많지 않다.
: 다만 로직을 P와 C로 분리하여, 오래 걸리는 작업은 C가 담당하면 사용자 입장에서의 응답속도가 빨라짐
11. RabbitMQ
• 큐에서 순서대로 메시지를 읽어서 C1, C2, ... 순서대로 번갈아 수행한다.
• 따라서 C1과 C2가 다른 메시지를 받지만 하는 일은 같다.
12. RabbitMQ
• X(fanout)에 의해, 여러 큐에 모두 동일한 메시지가 삽입된다.
• 따라서 C1, C2가 모두 동일한 메시지를 받지만 하는 일은 다르다.
• Hellow World 예제에서 C가 하던 일을 C1, C2로 분리했다고 생각할 수 도 있다.
13. RabbitMQ
• C가 X(direct)와 큐를 binding할 때, Key를 명시하고, 메시지의 Key와 비교해서 동일한(complete
matching)경우만 각 큐에 삽입된다.
• 위의 그림에서 Key가 error일 때는 두 큐에 모두 삽입되고, Key가 info, warning일 경우에는 두번 째 큐
에만 삽입된다. 그 외의 Key는 큐에 삽입되지 않는다. 다시 말해, 그 외의 key를 가진 메시지는 버려진
다.
• 위의 경우 C1은 중대한 오류(error)에 대해서만 처리하고, C2는 모든 오류(info, error, warning)에 대해
서 처리한다.
• 따라서 C1, C2는 다른 메시지를 받으며, 하는 일도 다르다.
14. RabbitMQ
• 위의 Routing 예제와 비슷하다. 단 Key를 비교할 때, complete matching이 아니라 pattern matching을 사용
• 이 때 Key는 .(마침표)로 구분되어 word(토큰)로 나누어지며, 각 word에 대하여 *는 1 단어를, #는 0또는 여
러 개의 단어를 의미한다는 것이다. 개인적인 생각이지만, *와 #대신 일반적인 와일드카드인 ?와 *를 사용하
는 것이 더 직관적이었을 것이다.
• 주의할 점은, 위 그림에서 P의 Key가 "lazy"일 때도 Q2에 전달된다는 것이다. 다시 말해 .(마침표)는 단어의
구분자일 뿐이며 X가 비교할 때에는 포함되지 않는다는 것이다.
• 따라서 C1, C2는 다른 메시지를 받으며, 하는 일도 다르다.