프로그래밍/RabbitMQ

[RabbitMQ] 메시지 송수신 - Publish/Subscribe

Victory_HA 2023. 4. 19. 10:19

이전 포스팅 : 메시지 송신/수신 - WorkQueue

RabbitMQ

메시지 송신/수신 - Publish/Subscribe

  • Publisher가 생성된 2개의 Queue에 메시지를 송신하면,
  • 각 Queue를 구독중인 2개의 Consumer는 동일한 메시지를 수신합니다.

Exchange

  • RabbitMQ의 핵심 아이디어는 Producer가 메시지를 Queue에 직접 보내지 않는다는 것입니다.
  • Producer와 Consumer 중간에서 Exchange가 메시지를 수신하고, Queue에 메시지는 송신해줍니다.
  • Exchange를 정의할 때 메시지를 어떻게 처리해야하는지 알아야합니다.

Exchange의 메시지 처리 방식 4가지

  • direct
  • topic
  • headers
  • fanout

fanout

  • 여기선 fanout방식에 대해 알아봅시다.
  • fanout은 수신한 모든 메시지를 모든 Queue에 브로드캐스트합니다.

Exchange 선언 시 fanout 설정

var exchangeName = "exchange"
channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout);

publish 설정

var message = GetMessage(args);
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: exchangeName,
                     routingKey: string.Empty,
                     basicProperties: null,
                     body: body);

Binding

  • Exchange와 Queue 간의 관계를 Binding이라고 합니다.
  • Binding을 맺어줘야 Exchange가 Queue에 메시지를 보낼 수 있습니다.
  • 아래와 같이 Exchange 1개에 Queue 2개를 bind할 수 있습니다.

Queue Binding 설정

  • Queue2를 추가로 바인딩할 수 있다.
// binding queue1
var queueName1 = "queue1";
channel.QueueBind(queue: queueName1,
                  exchange: exchangeName,
                  routingKey: string.Empty);

// binding queue2 (MultiBinding)
var queueName2 = "queue2";
channel.QueueBind(queue: queueName2,
                  exchange: exchangeName,
                  routingKey: string.Empty);

Temp Queue

  • 익명의 Temp Queue를 생성할 수도 있습니다.

Temp Queue 선언

var queueName = channel.QueueDeclare().QueueName;

C# RabbitMQ - Pub/Sub 샘플

  • 기본적으로 RabbitMQ 서버가 실행됐다는 전제하에 실행해야합니다.
  • RabbitMQ Config는 사용자 환경에 맞게 설정해야합니다.
  • pub, sub1, sub2 모두 실행시켜줘야 합니다.

rabbitMQ_PubSub.zip
1.20MB