RabbitMq怎么确保消息不丢失

  介绍

本篇内容主要讲解“RabbitMq怎么确保消息不丢失”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“RabbitMq怎么确保消息不丢失”吧!

<节> <节>

<强>①生产阶段,生产者创建消息,经过网络发送到兔子服务器

<强>②消息存储阶段,首先被发送到交换器然后经过路由算法,到达队列,等待被拉取消费

<强>③消费阶段,消费者经过网络从兔子服务器拉取消息进行消费,

 RabbitMq怎么确保消息不丢失


这三个阶段都有可能消息丢失、下面一一分析。

<强>消息存储阶段

<节>正常情况下,我们使用   ,BasicPublish   ,方法发送消息到交换器上然后路由到队列上面,消费者还没进行消费,此时服务器重启了(队列,交换器使用默认的创建方式),会发生什么?答案是:消息丢失。原因很简单:消息在内存中,没有刷盘,并且,他们默认是非持久化的,服务重启之后,它们需要重新创建,消息自然就丢失!   , <>部分还好,兔子提供持久化的机制,队列,交换器创建的时候,   ,耐用   ,属性设置为真的,同时消息投递模式(   ,发送模式   ,)设置为2,则消息标记成持久化。这样可以避免服务器重启消息丢失的情况。   ,

 RabbitMq怎么确保消息不丢失

<强>发送阶段

<>部分由于发布操作不返回任何信息给生产者,那你怎么知道服务器是否已经持久化了持久消息到硬盘呢?服务器可能在把消息写入磁盘前就宕机了,消息因此而丢失!   ,

,有。)

<节>兔子提供两中解决方案,   ,事务   ,但,是性能会大打折扣,而且会使生产者应用程序产生同步。生产环境一般不会采用;另外一种方案是   ,确认模式   ,。也很简单,消息路由给所有匹配的订阅队列中,之后会异步的告之生产者。使用channel.ConfirmSelect()方法,使信道开启确认模式,然后注入两个回调函数,ack和纳事件。   , <节>
 <代码>频道。BasicAcks +=(发送者,ev)=祝辞 <代码>,,,,,,,,{ <代码>,,,,,,,,,,Console.WriteLine(“消息已经确认收到“代码+ ev.DeliveryTag);  <代码> 
<代码>,,,,,,,,}, <代码>
<代码>,,,,,,,通道。BasicNacks +=(发送者,ev)=祝辞 <代码>,,,,,,,,{ <代码>,,,,,,,,,,Console.WriteLine(“消息未确认“;代码+ ev.DeliveryTag); <代码>,,,,,,,,},
  ,


<强>消费阶段

<节>你可能会问,消费端消息怎么会丢失呢? Rabbitmq提供自动和手动确认消息,然后消息从队列中移除。如果   ,autoAck   ,为真实的,自动确认模式,服务器就会在消息发给消费端后自动将其出队。如果因为某些原因连接中断了,或者你的消费端应用发生了故障,那么消息就会丢失!   ,

通过把AutoAck设置为false,手工确认,告知服务器,消息已经处理了,可以进行消息出队删除。

,

<节> <>之前,channel.BasicConsume(队列:queueName,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, AutoAck:,假的,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,消费者:,消费者),   , <节> <>之前,consumer.Received  +=,(模型,ea),=在,,,,,,,,,,,,,,,,{,,,,,,,,,,,,,,,,,,,//dosometing ,,,,,,,,,,,,,,,,,,, channel.BasicAck (ea.DeliveryTag,,假);//确认,,,,,,,,,,,,,,,,},   ,

小结:如果做了以上的处理,那么消息就不会跟你躲猫猫了。这里有性能的问题,消息持久化,是要刷到磁盘上的会影响投递速度,并且消息确认也会影响到消息投递速度。不基本上能够满足需求了。如果不能满足性能需求,可以使用其他方法,比如在每次发送消息的时候,都包含应答队列的名称,这样消费者就可以回发应答以确认接受到了。如果消息应答未在合理时间范围内到达,生产者就重新发送消息。

RabbitMq怎么确保消息不丢失