Golang RabbitMQ 토픽 모드는 라우팅 모드(직접)와 유사하지만, 토픽 모드에서의 라우팅 파라미터는 퍼지 매칭을 지원하는 것이 가장 큰 차이입니다. 토픽 모드의 교환 타입은 'topic'입니다.

토픽 모드의 아키텍처는 다음과 같습니다: RabbitMQ Topic Mode

참고: RabbitMQ 토픽 모드에 익숙하지 않다면 먼저 RabbitMQ 토픽 모드 섹션을 읽어주십시오.

1. 필수 튜토리얼

다음 섹션을 순서대로 읽어주십시오:

참고: Golang RabbitMQ 발행/구독 섹션에는 이미 완전한 코드 예제가 포함되어 있으므로, 다른 RabbitMQ 모드에 대해서는 교환 정의와 라우팅 파라미터만 다를 뿐입니다. 따라서 핵심 코드만 표시됩니다.

2. 토픽 교환 선언

err = ch.ExchangeDeclare(
  "tizi365_topic", // 교환 이름, 고유해야 함
  "topic",         // 교환 타입
  true,            // durable
  false,           // 자동 삭제
  false,           // 내부
  false,           // No-wait
  nil,             // Arguments
)

3. 메시지 보내기

    // 메시지 내용
    body := "안녕하세요 Tizi365.com!"

    // 메시지 발행
    err = ch.Publish(
        "tizi365_topic",      // 교환 이름
        "www.tizi365.com",    // 라우팅 파라미터, 메시지가 전송될 대상 큐를 결정하는 중요한 파라미터
        false,                // Mandatory
        false,                // Immediate
        amqp.Publishing {
            ContentType: "text/plain", // 메시지 콘텐츠 타입, 여기서는 일반 텍스트임
            Body:        []byte(body),  // 메시지 내용
        })

4. 메시지 소비

4.1. 교환 바인딩

// 조작할 큐 선언
    q, err := ch.QueueDeclare(
        "",    // 큐 이름, 입력하지 않으면 무작위로 생성됨
        false, // durable 큐
        false, // 사용하지 않을 때 삭제
        true,  // Exclusive
        false, // No-wait
        nil,   // Arguments
    )

    // 큐를 지정된 교환에 바인딩
    err = ch.QueueBind(
        q.Name,             // 큐 이름
        "*.tizi365.com",    // 라우팅 파라미터, * 와일드카드를 사용하여 한 단어와 일치시키며, #를 사용하면 여러 단어와 일치시킬 수 있음
        "tizi365_topic",    // 교환 이름, 메시지 전송자가 정의한 교환과 일치해야 함
        false,
        nil)

4.2. 메시지 처리

// 컨슈머 생성
    msgs, err := ch.Consume(
        q.Name, // 위에서 선언한 큐 이름 참조
        "",     // 컨슈머 이름, 입력하지 않으면 자동으로 생성됨
        true,   // 큐에 메시지 처리가 자동으로 확인되었음을 나타냄
        false,  // Exclusive
        false,  // No-local
        false,  // No-wait
        nil,    // Args
    )

    // 큐에서 메시지를 소비하기 위해 반복
    for d := range msgs {
        log.Printf("받은 메시지=%s", d.Body)
    }