Golang RabbitMQのワークモード:複数の消費者による並行消費の実現
説明: Pは生産者を表し、C1とC2は消費者を表し、赤色はキューを表します。
ヒント:各メッセージは1つの消費者のみによって消費されます。
事前チュートリアル
最初に、Golang RabbitMQクイックスタートチュートリアルを読んで、GolangにおけるRabbitMQの基本操作を理解してください。RabbitMQに不慣れな場合は、最初に前の章を読んでください。
並行消費
Golangでは、複数の消費者を実装するためにgoroutineを主に使用します。以下は、複数の消費者の実装例です。
ヒント:メッセージの送信方法については、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, // 操作するキュー名
"", // 消費者のユニークID、空の場合は自動的にユニークな値が生成されます
true, // メッセージを自動確認する(つまり、メッセージが処理されたことを自動的に確認する)
false, // 排他的
false, // No-local
false, // No-wait
nil, // Args
)
failOnError(err, "消費者の登録に失敗しました")
// ループ内でメッセージを処理
for d := range msgs {
log.Printf("[消費者番号=%d] 受信したメッセージ:%s", number, d.Body)
// ビジネス処理をシミュレートするために1秒間スリープ
time.Sleep(time.Second)
}
}(i)
}
// プログラムが終了しないように、メインのゴルーチンをブロックする
forever := make(chan bool)
<-forever
}
ヒント:RabbitMQが使用する交換のタイプに関係なく、キューは複数の消費者を持つことができ、複数の消費者を起動する方法はこの例と同じです。