티스토리 뷰

시리즈/Concurrency

RabbitMQ 왕기초

빅또리 2021. 10. 28. 19:50

큐와 consumer는 1 대 1! => 그래서 한 consumer가 받아보는 이벤트들은 큐에 시간순으로 정렬되어 있음이 보장된다.

 

mac에 설치해서 실행해보기

# 설치
brew install rabbitmq

# 포그라운드 실행
/usr/local/opt/rabbitmq/sbin/rabbitmq-server

# 백그라운드 실행
brew services start rabbitmq

localhost:15672 접속하고 초기 id/pw인 guest/guest 로 로그인하기.

 

 

 

 

라우팅

참고하기 : Part 4: RabbitMQ Exchanges, routing keys and bindings

출처 : https://www.cloudamqp.com/blog/part4-rabbitmq-for-beginners-exchanges-routing-keys-bindings.html

(예시 언어는 python!)

 

queue - exchange 바인딩

한개의 큐는 여러개의 exchange에 바인딩 할 수 있다 

A binding is a relationship between an exchange and a queue. This can be simply read as: the queue is interested in messages from this exchange.

channel.queue_bind(exchange='direct_logs',
                   queue='hello',
                   routing_key='black')

여기서 routing_key 파라미터는 basic_publish의 라우팅키랑 비교하는 값. direct, topic 타입 exchange에서만 쓰이는 값이다.

 

exchange 타입

 

direct => 라우팅 키 = 바인딩 (할때 명시한 라우팅) 키 인 큐에 메세지 전달.

# exchange 선언
channel.exchange_declare(exchange='direct_logs',
                         exchange_type='direct')
                         
# publish
channel.basic_publish(exchange='direct_logs',
                      routing_key='black',
                      body=message)

 

topic => 라우팅 키 패턴을 보고 하나 이상의 큐에 메세지 전달 ( *, # )

라우팅 키는 여러 단어가 . 로 구분된 형식

예)

agreements.*.*.b => only match routing keys where the first word is "agreements" and the fourth word is "b"

agreements.eu.berlin.# => matches any routing keys beginning with "agreements.eu.berlin"

 

fanout => 라우팅키나 패턴이랑 상관없이 fanout exchange에 연결된 모든 큐에 메세지 전달

 

headers => 라우팅 키 대신 메세지의 headers를 가지고 특정한 규칙의 라우팅 처리.

  • x-match = any 일 경우 헤더 key-value 중 하나가 binding의 key-value 중 하나와 일치하면 메시지 전달
  • x-match = all 일 경우 모든 값이 일치해야 메시지를 전달한다.
channel.basic_publish(exchange= 'amq.headers',
                      routing_key= 'example.key',
                      properties= pika.BasicProperties(
                          headers={'ham': 'good', 'x-match':'any'},
                      ),
                      body='Hello world!')

 

default

기본적으로는 모든 큐는 자동으로 pre-declared 된 이름 없는 exchange("") 랑 bind 되기 때문에, default exchange를 선택하면 라우팅키 랑 같은 이름의 큐로 배달된다.

# hello 큐로 배달됨
channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')

 

 

댓글
공지사항
최근에 올라온 글