Golang RabbitMQ çalışma modu, birden fazla tüketici tarafından eşzamanlı tüketimin gerçekleştirilmesi.
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.