الگوی مسیریابی RabbitMQ در Golang

الگوی مسیریابی در RabbitMQ الگوی ابدال نشر-اشتراک را براساس این الگو گسترش داده است. نوع ابدال برای الگوی مسیریابی مستقیم است که همچنین ابدال پیش‌فرض برای RabbitMQ می‌باشد. در بخش‌های گذشته، از ابدال صریح استفاده نشد، اما ابدال پایه‌ای استفاده شده واقعاً یک ابدال مستقیم بود.

نکته: اگر با قوانین الگوی مسیریابی آشنا نیستید، لطفاً الگوهای مسیریابی RabbitMQ را مطالعه کنید.

۱. آماده‌سازی آموزشی

لطفاً ابتدا فصل الگوی نشر-اشتراک RabbitMQ برای Golang را بخوانید. در اصل، انواع مختلف حالت‌های کاری RabbitMQ توسط انواع مختلف ابدال‌ها اجرا می‌شود. کد تقریباً یکسان است و تفاوت اصلی تعریف ابدال است. بنابراین، یک بار الگوی نشر-اشتراک درک شود، الگوهای دیگر بسیار ساده است.

۲. تعریف یک ابدال مستقیم

err = ch.ExchangeDeclare(
  "tizi365_direct", // نام ابدال، باید یکتا باشد
  "direct",         // نوع ابدال
  true,             // دائمی
  false,            // خودکار حذف شود
  false,            // داخلی
  false,            // بدون انتظار
  nil,              // آرگومان‌ها
)

۳. ارسال پیام‌ها

	// محتوای پیام
	body := "سلام Tizi365.com!"
	
	// ارسال پیام
	err = ch.Publish(
		"tizi365_direct",     // ابدال (نام ابدال)
		"blog",               // کلید مسیریابی، یک پارامتر حیاتی که تعیین می‌کند پیام شما به کدام صف ارسال خواهد شد
		false,                // اجباری
		false,                // فوری
		amqp.Publishing {
			ContentType: "text/plain",   // نوع محتوای پیام، در این حالت، متن ساده
			Body:        []byte(body),    // محتوای پیام
		})

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

۴.۱. اتصال به ابدال

// تعریف صف برای عملیات
q, err := ch.QueueDeclare(
  "",     // نام صف، اگر مشخص نشود، یک نام تصادفی تولید می‌شود
  false,  // صف دائمی
  false,  // حذف شود در صورت عدم استفاده
  true,   // انحصاری
  false,  // بدون انتظار
  nil,    // آرگومان‌ها
)

// اتصال صف به ابدال مشخص شده
err = ch.QueueBind(
  q.Name,             // نام صف
  "blog",             // کلید مسیریابی، اگر با پارامتر مسیریابی مشخص شده هنگام ارسال پیام مطابقت داشته باشد، پیام به صف فعلی تحویل داده خواهد شد
  "tizi365_direct",   // نام ابدال، که باید با ابدال تعریف شده در انتهای فرستنده پیام مطابقت داشت
  false,
  nil)

۴.۲. مصرف پیام‌ها

// ایجاد یک مصرف‌کننده
msgs, err := ch.Consume(
  q.Name, // مرجع به نام صف از پیش
  "",     // نام مصرف‌کننده، اگر پر نشود، یکی تصادفی تولید می‌شود
  true,   // خودکاراً پیام‌های پردازش شده توسط صف را تأیید می‌کند
  false,  // انحصاری
  false,  // بدون محلی
  false,  // بدون انتظار
  nil,    // آرگومان‌ها
)

// حلقه حلقه اجرا برای مصرف پیام‌ها در صف
for d := range msgs {
  log.Printf("پیام دریافت شد=%s", d.Body)
}