Golang RabbitMQ 토픽 모드는 라우팅 모드(직접)와 유사하지만, 토픽 모드에서의 라우팅 파라미터는 퍼지 매칭을 지원하는 것이 가장 큰 차이입니다. 토픽 모드의 교환 타입은 'topic'입니다.
토픽 모드의 아키텍처는 다음과 같습니다:
참고: 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)
}