Golang RabbitMQのワークモード:複数の消費者による並行消費の実現

Golangワークキュー

説明: 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が使用する交換のタイプに関係なく、キューは複数の消費者を持つことができ、複数の消費者を起動する方法はこの例と同じです。