حالت کاری RabbitMQ Golang، دستیابی به مصرف متوازن توسط چند مصرف‌کننده

صف کاری Golang

توضیح: P نماینده تولید کننده، C1 و C2 نماینده مصرف‌کننده‌ها، و رنگ قرمز نماینده صف است.

نکته: هر پیام تنها می‌تواند توسط یک مصرف‌کننده مصرف شود.

آماده‌سازی اولیه

لطفاً ابتدا آموزش سریع RabbitMQ برای Golang را بخوانید تا عملیات پایه‌ای Golang بر روی RabbitMQ را بفهمید. اگر با RabbitMQ آشنا نیستید، لطفاً ابتدا فصل‌های قبلی را بخوانید.

مصرف متوازی

Golang اصولاً از گوروتین برای پیاده‌سازی چند مصرف‌کننده استفاده می‌کند، زیرا اینجا پیاده‌سازی چند مصرف‌کننده آمده است.

نکته: برای ارسال پیام‌ها، لطفاً به آموزش سریع RabbitMQ برای Golang مراجعه کنید.

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,   // بدون انتظار
				nil,     // آرگومان‌ها
			)
			failOnError(err, "خطا در اعلام یک صف")

			// ایجاد یک مصرف‌کننده
			msgs, err := ch.Consume(
				q.Name, // نام صف برای انجام عملیات
				"",     // شناسه یکتا برای مصرف‌کننده، اگر پر نشود، به طور خودکار یک مقدار یکتا تولید می‌شود
				true,   // خودکار تأیید کردن پیام‌ها (یعنی به طور خودکار تأیید می‌کند که پیام پردازش شده است)
				false,  // انحصاری
				false,  // بدون محلی
				false,  // بدون انتظار
				nil,    // آرگومان‌ها
			)
			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، صف‌ها می‌توانند دارای چند مصرف‌کننده باشند و روش شروع چند مصرف‌کننده مانند این مثال است.