如何告诉 Rabbit 该任务在 .Net Core 中失败

How to tell Rabbit to that task fails in .Net Core

假设我们有一个名为“NotificationQ”的 Q,并且有一个消费者从该 Q 获取任务并向客户发送电子邮件。

电子邮件进程通过 API 从 mailgun 发送电子邮件。那个 API 请求不会每次都变成 200(原因不重要)。那时我需要告诉 RabbitMQ 任务失败了。我知道有一个名为 autoAck 的功能,但如果请求失败,RabbitMQ 客户端包如何理解失败。

我是否手动触发 ack 表示请求失败?

我使用 https://www.nuget.org/packages/RabbitMQ.Client/ 包来处理 RabbitMQ 任务。

            var channel = RabbitPrepareFactory.GetConnectionFactory();

            channel.BasicQos(0, 1, false);

            var notificationPack = channel.BasicGet("notification", true);


            var message = System.Text.Encoding.UTF8.GetString(notificationPack.Body.ToArray());


            var task = JsonConvert.DeserializeObject<ForgetPasswordEmailNotification>(message);


            var isEmailSendSuccessful = SomeFakeEmailSendFunctions(task.Email);


            if (!isEmailSendSuccessful)
            {
                //something for tell RabbitMQ that task fail and not delte that task in q
                .......
            }

我认为这可能会有用。我会用像死信这样的东西 https://www.rabbitmq.com/dlx.html

因此,无论出于何种原因,每次消息失败时,您都会将消息推送到该队列。 一旦您的消息被您的消费者收到并且操作范围完成,该消息将被确认,以便其他消费者不会接受已经处理的消息。

[编辑] 我不认为处理来自队列的消息然后在您的后端发生问题时将其留在那里不是一个好主意。如果您实现死信队列,您可以尝试在某个时间重新处理这些消息(可能是 CronJob ),或者如果您真的不想拥有死信队列,您可以尝试在您的客户端中实现重试机制。波莉在你的情况下可以很好地工作 https://github.com/App-vNext/Polly