如果无法完成,则停止消费消息

Stop consumption of message if it cannot be completed

我是公共交通的新手,我有一个关于如何解决消息消费失败的问题。鉴于以下代码,我正在使用 INotificationRequestContract。如您所见,代码将中断且无法完成。

public class NotificationConsumerWorker : IConsumer<INotificationRequestContract>
{
    private readonly ILogger<NotificationConsumerWorker> _logger;
    private readonly INotificationCreator _notificationCreator;

    public NotificationConsumerWorker(ILogger<NotificationConsumerWorker> logger, INotificationCreator notificationCreator)
    {
        _logger = logger;
        _notificationCreator = notificationCreator;
    }

    public Task Consume(ConsumeContext<INotificationRequestContract> context)
    {
        try
        {
            throw new Exception("Horrible error");
        }
        catch (Exception e)
        {
            // >>>>> insert code here to put message back for later consumption. <<<<<
            _logger.LogError(e, "Failed to consume message"); 
            throw;
        }
    }
}

遇到这种消费失败的情况,我该如何最好地处理?在我的具体情况下,如果所需的外部服务不可用,则可能会发生这种情况。

我可以看到两个解决方案。

文档的 exceptions 部分提供了处理消费者异常的充分指导。

有两种重试方法,可以组合使用:

  1. 消息重试,在消息被锁定时等待下一次重试。因此,这些应该是简短的,以应对瞬态问题。
  2. 消息重新传递,它使用代理延迟传递或消息调度程序来延迟消息,以便在将来的某个时间点将其重新传递到接收端点。

一旦所有 retry/redelivery 次尝试都用完,消息将移至 _error 队列。