EasyNetQ支持nack吗?

我真正想要做的就是在消息被当前消费者拒绝的情况下将消息留在队列中。 在RabbitMQ中,我可以发送一个NACK来完成这个任务。 EasyNetQ支持NACK吗? 是否有另一种方法来实现我正在寻找的行为?

更新 :不是很多回应,所以我想知道人们通常如何处理EasyNetQ中缺乏NACK。 没有basic.reject的等价物限制消费者“我总是可以处理每个消息”场景。 我想消费者可能会抛出一个特定的“被拒绝”异常,导致EasyNetQ将消息出队到错误队列中,并且我可以通过这些错误重新发送消息。 其他人有其他解决方法吗?


我认为你可以通过实现你自己的IConsumerErrorStrategy来改变行为:

https://github.com/EasyNetQ/EasyNetQ/blob/master/Source/EasyNetQ/Consumer/DefaultConsumerErrorStrategy.cs

但是如果你需要这种控制,你可能会考虑直接使用RabbitMQ客户端?


我使用了EasyNetQ将近一年,但无论我们如何调整它(除了其他事项外,还增加了我们自己的IConsumerErrorStrategy实现),但我从来没有真正以我想要的方式工作。 单线程这一事实在SubscribeAsync处理程序中执行RequestAsync时给了我们一些意想不到的行为(有时会发生死锁)。

我们的解决方案是从EasyNetQ转向。 在与官方RabbitMq客户端合作一段时间后,我花了几天的时间编写超级瘦客户端。 它受EasyNetQ的影响,并支持EasyNetQ的大部分概念。 不过,我添加了一些整洁的功能,如可插入的消息上下文。 我认为我刚刚添加的IAdvancedMessageContext的Nack功能可能适合您:

var client = service.GetService<IBusClient<AdvancedMessageContext>>();
client.RespondAsync<BasicRequest, BasicResponse>((req, ctx) =>
{
  ctx?.Nack(); // the context implements IAdvancedMessageContext.
  return Task.FromResult<BasicResponse>(null);
}, cfg => cfg.WithNoAck(false));

如果你有兴趣,你可以在Github页面阅读更多关于它的信息(尤其是NackTests.cs )。


这听起来像你正在努力处理失败。 你可以NACK一条消息,但这意味着它位于队列的头部。 好极了,但这意味着你最终会得到一堆真实无法处理的消息,而且你将无法真正处理真正的消息。

我在使用RabbitMQ时一直使用的解决方案是利用EasyNetQ的默认错误处理,并有一个单独的应用程序来重新发送消息。 也就是说,当在RabbitMQ中捕获异常时,它会将消息路由到一个名为“EasyNetQ_Default_Error_Queue”的队列。 您可以覆盖此名称,并将不同的队列转到不同的错误队列,但现在让我们继续使用默认队列。 然后,您可以拥有一个Windows Service / Azure Worker角色来读取这些消息,并计算出要执行的操作。 这可能包括在你的邮件信封/包装上有一个“RetryCount”,以确保它只循环很多次。 总而言之,这将是一个有点工作。

您发现的是使用RabbitMQ / EasyNetQ时遇到的许多问题。 她很生。

链接地址: http://www.djcxy.com/p/34207.html

上一篇: Does EasyNetQ support nack?

下一篇: EasyNetQ model shutdown