وضع العمل 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()

	// إنشاء ٥ مستهلكين من خلال الجوروتينات
	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)
				// محاكاة معالجة الأعمال، نوم لمدة ثانية واحدة
				time.Sleep(time.Second)
			}
		}(i)
	}

	// تعليق الجوروتين الرئيسي لمنع البرنامج من الخروج
	إلى الأبد := make(chan bool)
	<-إلى الأبد
}

نصيحة: بغض النظر عن نوع التبادل المستخدم من قبل RabbitMQ، يمكن أن تحتوي الصفوف على عدة مستهلكين، وطريقة بدء عدة مستهلكين هي نفسها كما في هذا المثال.