RabbitMQ'da, bir kuyruktaki bir mesaj (tüketicilerin işleyemediği bir mesaj) bir dead letter haline geldiğinde, başka bir borsaya, yani dead letter borsasına yönlendirilir. Dead letter borsası daha sonra ölü mektubu kuyruğuna, yani dead letter kuyruğuna iletir.

Dead Letter Kuyruğu İllüstrasyonu

Dead Letter Kuyruğu

Yukarıdaki illüstrasyon, ölü mektupların oluşturulmasından işlenmelerine kadar olan süreci açıklar.

Dead Letter'ların Oluşturulması

Aşağıdakiler, dead letter'ların oluşturulması için koşullardır:

  • Mesaj, tüketici tarafından manuel olarak reddedildi (basic.reject / basic.nack), ve requeue = false olarak ayarlandı.
  • Mesajın süresi (TTL) dolmuş.
  • Kuyruk maksimum uzunluğa ulaştı.

Dead Letter Kuyruğu İşleme Adımları

  1. Ölü mektubu borsasını tanımlayın (isim sizi yanıltmasın, bu sadece ölü mektup işleme bağlamında adlandırılmış normal bir borsadır).
  2. Ölü mektubu borsasına bağlanacak bir kuyruk tanımlayın (bu kuyruk ölü mektubu kuyruğu olarak adlandırılır ve aynı zamanda normal bir kuyruktur).
  3. Ölü mektubu kuyruğunu tüketmek üzere ölü mektubu tüketicisi tanımlayın (isim sizi yanıltmasın, bu da normal bir tüketicidir).
  4. Ölü mektubu borsasını belirli bir kuyruğa bağlayın (ölü mektupları işlemesi gereken kuyruk bağlanmalıdır).

İpucu: İlkeyi anlamak için yukarıdaki illüstrasyona bakın. Tüm programlama dilleri ölü mektubu kuyruklarını benzer bir şekilde işler.

Golang'da Dead Letter Kuyruğunu İşleme

1. Ölü Mektubu Borsasını Tanımlayın

Normal bir borsa gibi tanımlayın.

// Borsayı tanımlayın
err = ch.ExchangeDeclare(
    "tizi365.dead",   // Borsa adı
    "topic", // Borsa tipi
    true,     // Dayanıklı
    false,
    false,
    false,
    nil,
)

2. Ölü Mektubu Kuyruğunu Tanımlayın

Normal bir kuyruk gibi tanımlayın.

    // Kuyruğu tanımlayın
    q, err := ch.QueueDeclare(
        "",    // Kuyruk adı, rastgele bir tane oluşturmak için boş bırakın
        false, // Dayanıklı kuyruk
        false,
        true,
        false,
        nil,
    )

    // Kuyruğu ölü mektubu borsasına bağlayın
    err = ch.QueueBind(
        q.Name, // Kuyruk adı
        "#",     // Yol yönlendirme anahtarı, # tüm yol yönlendirme anahtarlarını eşleştirir, tüm ölü mektup iletilerini almak anlamına gelir
        "tizi365.dead", // Ölü mektubu borsa adı
        false,
        nil)

İpucu: Ölü mektubu kuyruğunu normal bir kuyruk gibi işleyin.

3. Ölü Mektubu Tüketicisini Tanımlayın

// Bir tüketici oluşturun
msgs, err := ch.Consume(
    q.Name, // Önceki ölü mektubu kuyruk adına referans verin
    "",     // Tüketici adı, sağlanmazsa rastgele bir tane oluşturulur
    true,   // Mesaj işleme otomatik geribildirimi
    false, 
    false, 
    false, 
    nil,
)

// Ölü mektubu kuyruğundan mesajları tüketmek için döngü oluşturun
for d := range msgs {
    log.Printf("Ölü mektubu mesajı alındı=%s", d.Body)
}

4. Ölü Mektubu Borsasını Belirli Bir Kuyruğa Bağlayın

	// Kuyruk özellikleri
	props := make(map[string]interface{})
	// Ölü mektubu borsasını bağlayın
	props["x-dead-letter-exchange"] = "tizi365.dead"
	// İsteğe bağlı: Ölü mektubu ölü mektubu borsasına iletilmekteyken yönlendirme anahtarını ayarlayın. Belirtilmezse, orijinal iletişim yönlendirme anahtarı kullanılır.
	// props["x-dead-letter-routing-key"] = "www.tizi365.com"

	q, err := ch.QueueDeclare(
		"tizi365.demo.hello", // Kuyruk adı
		true,   // Dayanıklı
		false, 
		false, 
		false,   
		props,     // Kuyruk özelliklerini ayarlayın
	)

Bu şekilde, tizi365.demo.hello kuyruğundaki mesajlar ölü mektup haline geldiğinde, tizi365.dead ölü mektubu borsasına yönlendirilecektir.