RabbitMQ'da Dead Letter Exchange'in (DLX) ne olduğunu bildiğinizi varsayıyorum. Eğer bilmiyorsanız, dökümanları okumalısınız. Kısacası, mesajınız herhangi bir nedenle tüketilmezse, araştırma için başka bir kuyruğa girer. Dead Letter Exchange ve kuyruğun diğerlerinden önce tanımlandığından emin olun, aksi takdirde iletiler sessizce düşürülür.


Kurulum


Çalışan bir tüketici uygulamanız olduğunu varsayalım. Buna bir Dead Letter Exchange ve kuyruk ekleyelim.


# The current properties
ExchangeType: direct
ExchangeName: user
RoutingKey: create
QueueName: user_create

# New DLX properties
ExchangeType: fanout
ExchangeName: user_dlx
QueueName: user_create_dlx

Yeni DLX bildirimleri


Diğeri ne olursa olsun değişim türünü (exchange) fanout olarak belirleyin.


if err := channel.ExchangeDeclare(
"user_dlx",
"fanout",
true,
false,
false,
false,
nil,
); err != nil {
return err
}

if _, err := channel.QueueDeclare(
"user_create_dlx",
true,
false,
false,
false,
nil,
); err != nil {
return err
}

if err := channel.QueueBind(
"user_create_dlx",
"",
"user_dlx",
false,
nil,
); err != nil {
return err
}

Değişiklikler


Yapılandırmaya amqp.Table{"x-dead-letter-exchange": "user_dlx"}, ekini ekliyoruz. Bu mevcut kuyruğunuza gider.


if _, err := channel.QueueDeclare(
"user_create",
true,
false,
false,
false,
amqp.Table{"x-dead-letter-exchange": "user_dlx"},
); err != nil {
return err
}

Test


Tüketicide aşağıdaki kodu kullanırsanız, ileti orijinal kuyruktan çıkarılır ve DLX kuyruğuna konur.


message.Nack(false, false)