Golang RabbitMQ'nun Basit Kuyruk Modu
Açıklama: P, üreticiyi temsil eder, C, tüketicileri temsil eder ve kırmızı da sırayı temsil eder.
Not: Eğer RabbitMQ hakkında bilgi sahibi değilseniz, lütfen önce RabbitMQ Temel Kavramları bölümünü okuyun.
1. Bağımlılıkları Yükle
go get github.com/streadway/amqp
Bağımlılık paketini içe aktar
import (
"github.com/streadway/amqp"
)
2. Mesaj Gönder
Aşağıdaki adımlar, mesaj üreticisinin mesajın nasıl iletildiğini göstermektedir.
2.1. RabbitMQ Sunucusuna Bağlan
// RabbitMQ sunucusuna bağlan
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
defer conn.Close()
Bağlantı adresi açıklaması:
amqp://kullanıcıadı:şifre@RabbitMQAdresi:port/
2.2. Bir Kanal Oluştur
Çoğu işlem kanal üzerinde gerçekleştirilir.
ch, err := conn.Channel()
defer ch.Close()
2.3. Bir Kuyruk Bildir
Okunması veya yazılması gereken kuyruğu temsil eder.
q, err := ch.QueueDeclare(
"hello", // Kuyruk adı
false, // Mesaj kalıcılığı
false, // Kuyruk kullanılmadığında kaldırılsın
false, // Özel
false, // Bekleme yok
nil, // Argümanlar
)
2.4. Mesajları Gönder
// Mesaj içeriği
body := "Merhaba Dünya!"
// Mesajı gönder
err = ch.Publish(
"", // Exchange (burada ihmal ediliyor)
q.Name, // Yönlendirme parametresi, kuyruk adını yönlendirme parametresi olarak kullan
false, // Zorunlu
false, // Anında
amqp.Publishing {
ContentType: "text/plain",
Body: []byte(body), // Mesaj içeriği
})
2.5. Mesaj Gönderme İşlemi İçin Tam Kod
package main
// Paketleri içe aktar
import (
"log"
"github.com/streadway/amqp"
)
// Hataları işle
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()
// Bir kanal oluştur
ch, err := conn.Channel()
failOnError(err, "Kanal oluşturulamadı")
defer ch.Close()
// İşlem yapmak üzere kuyruğu bildir
q, err := ch.QueueDeclare(
"hello", // Ad
false, // Kalıcı
false, // Kullanılmadığında sil
false, // Özel
false, // Bekleme yok
nil, // Argümanlar
)
failOnError(err, "Kuyruk bildirilemedi")
// Gönderilecek mesaj içeriği
body := "Merhaba Dünya!"
// Mesajı gönder
err = ch.Publish(
"", // Değişim
q.Name, // Yönlendirme anahtarı
false, // Zorunlu
false, // Anında
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(body),
})
failOnError(err, "Mesaj gönderilemedi")
log.Printf(" [x] Gönderilen %s", body)
}
3. Mesaj Almak
Mesaj almanın ilk üç adımı, sırasıyla 2.1, 2.2 ve 2.3 bölümlerine denk gelir, mesaj göndermeyle aynıdır. Mesaj almak için tam kod aşağıdaki gibidir:
package main
// Paketleri içe aktar
import (
"log"
"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()
// Bir kanal oluştur
ch, err := conn.Channel()
failOnError(err, "Kanal açılamadı")
defer ch.Close()
// Üzerinde işlem yapılacak kuyruğu tanımla
q, err := ch.QueueDeclare(
"hello", // Kuyruk adı, mesaj gönderme için kullanılan kuyruk adıyla aynı olmalı
false, // dayanıklı (durable)
false, // kullanılmadığında sil
false, // özel
false, // bekleme yok
nil, // argümanlar
)
failOnError(err, "Kuyruk tanımlanamadı")
// Bir mesaj tüketici oluştur
msgs, err := ch.Consume(
q.Name, // Kuyruk adı
"", // Tüketici adı, doldurulmazsa otomatik olarak benzersiz bir kimlik oluşturulur
true, // Mesajları otomatik olarak onaylama, yani mesajın başarıyla işlendiğini otomatik olarak RabbitMQ'ya bildirme
false, // özel
false, // yerel değil
false, // bekleme yok
nil, // argümanlar
)
failOnError(err, "Tüketici kaydı yapılamadı")
// Kuyruktan mesajları almak için döngü içinde kullan
for d := range msgs {
// Mesaj içeriğini yazdır
log.Printf("Bir mesaj alındı: %s", d.Body)
}
}