用Golang创建一个RabbitMQ DLX的示例

89 阅读1分钟

我假设您知道 RabbitMQ 中的 Dead Letter Exchange (DLX) 是什么。如果您不知道,那么您应该阅读文档。简而言之,如果你的消息由于某种原因没有被消费,它就会被放到另一个队列中进行调查,如此循环。请确保死信交换和队列是在其他人之前声明的,否则消息将被默默地丢弃。

设置

我假设你已经有一个工作正常的消费者应用程序。让我们给它添加一个死信交换和队列:

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

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

新的DLX声明

不管其他的是什么,保持交换类型为fanout

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
}

修改内容

只是在配置中添加amqp.Table{"x-dead-letter-exchange": "user_dlx"}, 。这就到了你现有的队列:

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

测试

如果你在消费者中使用下面的代码,它将把消息从原来的队列中取出并放入DLX队列:

message.Nack(false, false)