Golang RabbitMQ çalışma modu, birden fazla tüketici tarafından eşzamanlı tüketimin gerçekleştirilmesi.

Golang çalışma kuyruğu

Açıklama: P, üreticiyi temsil eder, C1 ve C2 tüketiciyi temsil eder ve kırmızı renk kuyruğu temsil eder.

İpucu: Her mesaj yalnızca bir tüketici tarafından tüketilebilir.

Öncesi Kılavuz

Lütfen önce Golang RabbitMQ Hızlı Başlangıç Kılavuzu'nu okuyun, temel Golang işlemlerini RabbitMQ üzerinde anlamak için. Eğer RabbitMQ hakkında bilginiz yoksa, lütfen önceki bölümleri okuyun.

Eşzamanlı Tüketim

Golang, özellikle gorutinler kullanarak birden fazla tüketiciyi uygulamak için kullanılır, aşağıda birden fazla tüketici uygulamanın örnekleri bulunmaktadır.

İpucu: Mesaj göndermek için nasıl yapılacağı hakkında bilgi almak için Golang RabbitMQ Hızlı Başlangıç Kılavuzu'na bakınız.

package main

import (
	"log"
	"time"

	"github.com/streadway/amqp"
)

// Hata işleme
func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	// RabbitMQ'ya bağlan
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "RabbitMQ'ya bağlanılamadı")
	defer conn.Close()

	// Gorutinler aracılığıyla 5 tüketici oluştur
	for i := 0; i < 5; i++ {
		go func(number int) {
			// Her tüketici için bir rabbitmq kanalı oluştur
			ch, err := conn.Channel()
			failOnError(err, "Kanal açılamadı")
			defer ch.Close()

			// İşlem yapılacak kuyruğu tanımla
			q, err := ch.QueueDeclare(
				"hello", // Kuyruk adı
				false,   // Kalıcı
				false,   // Kullanılmadığında sil
				false,   // Özel
				false,   // Bekleme yok
				nil,     // Argümanlar
			)
			failOnError(err, "Kuyruk tanımlanamadı")

			// Tüketici oluştur
			msgs, err := ch.Consume(
				q.Name, // İşlem yapılacak kuyruk adı
				"",     // Tüketici benzersiz kimliği, doldurulmazsa otomatik olarak benzersiz bir değer oluşturulur
				true,   // Mesajları otomatik olarak onayla (yani mesajın işlendiğini otomatik olarak onayla)
				false,  // Özel
				false,  // Yerel yok
				false,  // Bekleme yok
				nil,    // Argümanlar
			)
			failOnError(err, "Tüketici kaydedilemedi")

			// Döngü içinde mesajları işle
			for d := range msgs {
				log.Printf("[Tüketici numarası=%d] Mesaj alındı: %s", number, d.Body)
				// İş sürecini simüle et, 1 saniye bekle
				time.Sleep(time.Second)
			}
		}(i)
	}

	// Programın çıkmasını engellemek için ana gorutenu askıya al
	sonsuz := make(chan bool)
	<-sonsuz
}

İpucu: RabbitMQ'nun kullanmış olduğu herhangi bir değişim türüne bakılmaksızın, kuyrukların birden fazla tüketiciye sahip olabilmesi, bu örnekte olduğu gibi birden fazla tüketiciyi başlatmanın yolu aynıdır.