繁体   English   中英

RabbitMQ验证消息已发送

[英]RabbitMQ Verify Message Was Sent

这个问题已经存在并得到回答。 但是答案中有阴暗面。 我的频道已经支持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的情况下BasicNack再次发送它?

使用BasicAcksBasicNacks事件处理程序是独立调用的Channel.WaitForConfirmOrDie

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM