rabbitmq如何确保消息不会丢失
在最后一部分,我写了几个关于掌握拉比质量的重要概念。本文从一条消息开始,总结了关于消息丢失的头痛问题。网络故障、服务器重启、硬盘损坏等。都会导致信息丢失。新闻从生产到消费的主要结果如下。
(1)在制作阶段,制作方创建一条消息,通过网络发送到兔子服务器。
(2)在消息存储阶段,消息首先发送到交换机,然后通过路由算法传递,到达队列,等待被拉取和消耗。
(3)消费阶段,消费者通过网络从兔子服务器拉消息进行消费。
消息丢失在所有三个阶段都是可能的,这将在下面逐一分析。
消息存储阶段
在正常情况下,我们使用BasicPublish方法将消息发送到交换机,然后将其路由到队列。在消费者消费之前,服务器重新启动(默认情况下创建队列和交换机)。会发生的是信息丢失。原因很简单:消息在内存中,默认不持久。服务重启后,需要重新创建,消息自然会丢失!
幸运的是,兔子提供了一种坚持的机制。创建队列和开关时,持久属性设置为true,消息传递模式设置为2,因此消息被标记为持久。这样可以避免丢失服务器重启消息。
发送阶段
由于发布操作不会向生产者返回任何信息,您如何知道服务器是否已将持久消息保存到硬盘上?在将消息写入磁盘之前,服务器可能已关闭,消息将会丢失!
是的。)
Rabbit提供了两种解决方案,事务,但是性能将大大降低,生产者应用程序将同步。一般不采用生产环境;另一种解决方案是确认模式。也很简单。消息被路由到所有匹配的订阅队列,然后它将被异步告知生产者。使用频道。确认选择()方法将频道打开确认模式。然后注入两个回调函数,ack和nack事件。
频道。BasicAcks=(发送方,ev)=
{
控制台。WriteLine('消息已确认收到' ev。delivery tag);
};
频道。基本确认=(发送方,ev)=
{
控制台。WriteLine('消息未确认' ev。delivery tag);
};
消费阶段
你可能会问,消费者端的信息怎么会丢失?Rabbitmq提供自动和手动确认消息,然后将消息从队列中删除。如果自动检查为真,该模式将被自动确认,并且服务器将在消息发送给消费者后自动取消消息队列。如果连接由于某种原因中断,或者您的消费应用程序失败,那么消息将会丢失!
通过将自动检查设置为假,手动确认并通知服务器消息已被处理,可以出列和删除。
频道。基本消费(queue: queueName,
自动检查:为假,
消费者:消费者);
消费者。接收=(型号,ea)=
{
//剂量计量
频道。BasicAck(ea。DeliveryTag,false);//确认
};
总结:如果你做了以上处理,那么消息就不会瞒着你了。这里有一个性能问题,消息持久性,就是刷到磁盘会影响传递速度,消息确认也会影响传递速度。基本满足不了需求。如果不能满足性能要求,可以使用其他方法,比如每次
作者:阿本
【官方QQ群:跟本玩NET(全)】:422315558
【官方QQ群二:和阿本玩C#(全):574187616
【官方QQ三组:和本一起玩ASP.NET(全)】:967920586
【官方QQ四组:Asp.Net芯跨平台技术开发(可选)】:806491485
【官方QQ五组:NET Core跨平台开发技术(可选)]: 1036896405
【网易云课堂】:https://学习。163 .com/provider/2544628/index。htm共享=2 shareid=2544628
【腾讯课堂】:https://abennet.ke.qq.com
【51CTO学院】:https://edu.51cto.com/sd/66c64
【微信公众号】:http://dwz.cn/ABenNET
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/154014.html