RabbitMQ验证消息已发送

时间:2019-07-15 08:33:33

标签: c# rabbitmq

这个问题已经exists并且已经回答。但是答案中有阴暗面。我的频道已经支持BasicAcksBasicNacks处理程序(效果不佳):

Channel.BasicAcks += (sender, eventArgs) =>
{
    Console.WriteLine("Basic Ack!");
}
Channel.BasicNacks += (sender, eventArgs) =>
{
    Console.WriteLine("Basic Nack!");
}

我有一条消息已发布到队列中。所以我用下面的代码来做到这一点:

Channel.BasicPublish("ExchangeName", "QueueName", messageProperties, payload);
Channel.WaitForConfirmOrDie();

只要WaitForConfirmOrDie是一个void函数,如何知道队列是否接收到消息?或更精确地说,如何实现Ack处理程序以使我清楚地了解已发布的消息,以便不再将其再次发送到队列中,或者在BasicNack的情况下再次发送给我?

1 个答案:

答案 0 :(得分:2)

使用BasicAcksBasicNacks事件处理程序与调用Channel.WaitForConfirmOrDie无关。

Channel.WaitForConfirmOrDie是一种方便的方法,它同步等待消息确认。因此,如果您一一发布消息,则将一一等待这些提示。可以想象,这效率很低。

您应该做的就是像已完成的那样注册BasicAcksBasicNacks。您应该定义“可接受的未完成确认数”。这是实现此目的的一种方法-

  • 最多发布N条消息,不加确认/不确认(N由您决定)。如果下一封邮件超过N,请不要继续发布邮件。
  • 当一条消息未完成时,将其保存在本地(在RAM或本地磁盘中)。请记住,在收到确认之前,您不能百分百确定邮件是否已排队。
  • 如果邮件被确认,请将其从本地存储中删除并减少未完成邮件的数量,这允许继续发布(如果发布被阻止)。请记住,邮件可以在批次中确认。
  • 如果该邮件不存在,您可以重试一定次数,甚至可以重试一次。一旦超过重试限制,则引发应用程序异常。