如果无法完成,则停止消费消息
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 部分提供了处理消费者异常的充分指导。
有两种重试方法,可以组合使用:
- 消息重试,在消息被锁定时等待下一次重试。因此,这些应该是简短的,以应对瞬态问题。
- 消息重新传递,它使用代理延迟传递或消息调度程序来延迟消息,以便在将来的某个时间点将其重新传递到接收端点。
一旦所有 retry/redelivery 次尝试都用完,消息将移至 _error 队列。
我是公共交通的新手,我有一个关于如何解决消息消费失败的问题。鉴于以下代码,我正在使用 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 部分提供了处理消费者异常的充分指导。
有两种重试方法,可以组合使用:
- 消息重试,在消息被锁定时等待下一次重试。因此,这些应该是简短的,以应对瞬态问题。
- 消息重新传递,它使用代理延迟传递或消息调度程序来延迟消息,以便在将来的某个时间点将其重新传递到接收端点。
一旦所有 retry/redelivery 次尝试都用完,消息将移至 _error 队列。