Golang RabbitMQ'nun Basit Kuyruk Modu

Golang RabbitMQ

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)
	}
}