Golang RabbitMQ 작업 모드, 여러 소비자에 의한 병행 소비 구현
설명: P는 생산자를 나타내며, C1과 C2는 소비자를 나타내며, 빨간색은 큐를 나타냅니다.
팁: 각 메시지는 하나의 소비자에 의해서만 소비될 수 있습니다.
선행 자습서
먼저 Golang RabbitMQ 빠른 시작 자습서를 읽어서 Golang이 RabbitMQ에서의 기본 작업을 이해하십시오. 만약 RabbitMQ에 익숙하지 않다면, 이전 챕터를 먼저 읽어주십시오.
병행 소비
Golang은 주로 고루틴을 사용하여 여러 소비자를 구현합니다. 아래는 복수 소비자의 구현 예제입니다.
팁: 메시지를 보내는 방법에 대해서는 Golang RabbitMQ 빠른 시작 자습서를 참조하십시오.
package main
import (
"log"
"time"
"github.com/streadway/amqp"
)
// 에러 처리
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}
func main() {
// RabbitMQ에 연결
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
failOnError(err, "RabbitMQ 연결에 실패했습니다")
defer conn.Close()
// 고루틴을 통해 5개의 소비자 생성
for i := 0; i < 5; i++ {
go func(number int) {
// 각 소비자를 위한 rabbitmq 채널 생성
ch, err := conn.Channel()
failOnError(err, "채널 열기에 실패했습니다")
defer ch.Close()
// 조작할 큐를 선언
q, err := ch.QueueDeclare(
"hello", // 큐 이름
false, // 영속적인지 여부
false, // 사용하지 않을 시 삭제 여부
false, // 배타적인지 여부
false, // No-wait
nil, // 인수
)
failOnError(err, "큐 선언에 실패했습니다")
// 소비자 생성
msgs, err := ch.Consume(
q.Name, // 조작할 큐 이름
"", // 소비자 고유 식별자, 미기재 시 자동으로 고유한 값 생성
true, // 메시지 자동 확인 (즉, 메시지 처리가 자동 확인됨)
false, // 배타적인지 여부
false, // No-local
false, // No-wait
nil, // 인수
)
failOnError(err, "소비자 등록에 실패했습니다")
// 메시지 루프 처리
for d := range msgs {
log.Printf("[소비자 번호=%d] 받은 메시지: %s", number, d.Body)
// 비즈니스 처리 시뮬레이션, 1초간 대기
time.Sleep(time.Second)
}
}(i)
}
// 프로그램 종료를 방지하기 위해 메인 고루틴을 대기시킴
계속 := make(chan bool)
<-계속
}
팁: RabbitMQ가 사용하는 교환 타입과 무관하게 큐는 여러 소비자를 가질 수 있으며, 복수 소비자 시작 방법은 이 예제처럼 동일합니다.