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
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ı
- Ö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).
- Ö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).
- Ö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).
- Ö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.