上篇写了掌握Rabbitmq几个重要概念,从一条消息说起,这篇来总结关于消息丢失让人头痛的事情。网络故障、服务器重启、硬盘损坏等都会导致消息的丢失。消息从生产到消费主要结果以下几个阶段如下图。

①生产阶段,生产者创建消息,经过网络发送到rabbit服务器

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

③消费阶段,消费者经过网络从rabbit服务器拉取消息进行消费 

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

消息存储阶段

正常情况下,我们使用BasicPublish方法发送消息到交换器上然后路由到队列上面,消费者还没进行消费,此时服务器重启了(队列、交换器使用默认的创建方式),会发生什么?答案是:消息丢失。原因很简单:消息在内存中,没有刷盘,并且,他们默认是非持久化的,服务重启之后,它们需要重新创建,消息自然就丢失!

还好,Rabbit提供持久化的机制,队列、交换器创建的时候,durable属性设置为true,同时消息投递模式(delivery mode)设置为2,则消息标记成持久化。这样可以避免服务器重启消息丢失的情况。

发送阶段

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

有。)

Rabbit提供两中解决方案,事务,但是性能会大打折扣,而且会使生产者应用程序产生同步。生产环境一般不会采用;另外一种方案是确认模式。也很简单,消息路由给所有匹配的订阅队列中,之后会异步的告之生产者。使用channel.ConfirmSelect()方法,使信道开启确认模式。然后注入两个回调函数,ack和nack事件。

channel.BasicAcks += (sender, ev) =>{Console.WriteLine("消息已经确认收到" + ev.DeliveryTag);};channel.BasicNacks += (sender, ev) =>{Console.WriteLine("消息未确认" + ev.DeliveryTag);};

消费阶段

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

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

 channel.BasicConsume(queue: queueName,autoAck: false,consumer: consumer);
 consumer.Received += (model, ea) =>{//dosometingchannel.BasicAck(ea.DeliveryTag, false);//确认};

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

RabbitMq如何确保消息不丢失相关推荐

  1. RabbitMQ 如何确保消息的成功投递?幂等性?顺序性?

    RabbitMQ 如何确保消息的成功投递?RabbitMQ 如何保证不重复消费,保证数据不丢失?分布式系统里,如何保证数据的一致性?一串连环炮你是否顶得住? 其实这几个问题的原理大同小异,都可以在统一 ...

  2. springboot整合rabbitmq的发布确认,消费者手动返回ack,设置备用队列,以及面试题:rabbitmq确保消息不丢失

    目录 1.生产者发消息到交换机时候的消息确认 2.交换机给队列发消息时候的消息确认 3.备用队列 3.消费者手动ack rabbitmq的发布确认方式,可以有效的保证我们的数据不丢失. 消息正常发送的 ...

  3. RabbitMQ#RabbitMQ+Haproxy消息队列集群和代理部署

    文章目录 一.消息队列/中间件 1.RabbitMQ本质上起到的作用就是削峰填谷 2.MQ简介(RabbitMQ比Kafka) 3.MQ消息队列的分类 二.RabbitMQ介绍(端口15672) 1. ...

  4. 如何基于RocketMQ设计一套全链路消息不丢失方案?

    我们使用MQ作为消息中间件,传输一些消息的时候,必须考虑到消息丢失的可能.因为有的时候消息丢失了,会产生很严重的后果,比如消息计费数据,跟钱有关的消息. 这篇文章我们以RocketMQ为例来讲解,如何 ...

  5. RabbitMQ 入门系列(6)— 如何保证 RabbitMQ 消息不丢失

    1. 消息丢失源头 RabbitMQ 消息丢失的源头主要有以下三个: 生产者丢失消息 RabbitMQ 丢失消息 消费者丢失消息 下面主要从 3 个方面进行说明并提供应对措施 2. 生产者丢失消息 R ...

  6. rabbitmq如何保证消息不丢失_RabbitMQ的去重与防止消息的丢失

    Rabbitmq作为高并发的消息中间件,本文不在阐述基础概念.旨在分析与提供解决消息的丢失与重复的解决思路. RabbitMQ架构流程图 根据以上架构图,要明白消息走向的整个流程,生产者发送消息--& ...

  7. RabbitMQ之手动应答消息(消息不丢失)

    RabbitMQ之手动应答消息 1.为什么需要手动应答 当消费者完成一个任务需要一段时间,如果其中一个消费者处理一个长的任务并且只处理了部分突然他挂掉了,会发生什么情况.RabbitMQ一旦向消费者传 ...

  8. 消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?...

    大家好,我是 yes. 最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息 ...

  9. RocketMQ如何保证消息不丢失? 如何快速处理积压消息?

    文章目录 1. 哪些环节会有丢消息的可能? 2. 消息生产阶段如何保证消息不丢失 2.1 同步发送 2.2 采用事务消息 3. Broker如何保证接收到的消息不会丢失 4. 消费者如何确保拉取到的消 ...

最新文章

  1. mysql myisam转innodb_Mysql MyISAM数据库批量转换表引擎为Innodb
  2. Android开源SIP协议栈比较
  3. Linux多线程同步——信号量
  4. dns服务 很多问题,后续再研究
  5. 如何编写高性能的C#代码(四)字符串的另类骚操作
  6. 德勤发布《 2020 亚太四大半导体市场的崛起》报告,美国收入占比达到47%,中国大陆仅占 5%
  7. 东方财富代码选股_东方证券APP评测:智能选股方面优秀 投顾服务缺失
  8. 04,Django Form源码阅读
  9. 常用指令备忘录----持续更新
  10. 2018.08.17 洛谷P3135 [USACO16JAN]堡哞(前缀和处理)
  11. MapGIS考试大纲
  12. arma模型_R语言ARMA-GARCH-COPULA模型和金融时间序列案例
  13. POJ 3233 Matrix Power Series(矩阵快速幂)
  14. vue 设置表单必填项
  15. Java学习十四,JDBC,反射
  16. 2020高考倒计时html,2020高考倒计时的励志说说
  17. mysql错误码1003_MySQL错误解决10038
  18. 我接触过的广东美食——流口水
  19. 使用SPSS进行多元回归分析
  20. 调研当前大学生的三个痛点

热门文章

  1. python实现二叉树和它的七种遍历
  2. Codeforces 746 G. New Roads
  3. 原型继承+原型链 + 对象继承发展
  4. UVa 12100 - Printer Queue
  5. SQL对Xml字段的操作
  6. 十个必备的.NET开发小工具(1):Snippet Compiler
  7. 图解一步步安装SharePoint Foundation 2010
  8. 2019年4月第四周_2012年4月最佳怪胎文章
  9. Spring Data REST API集成Springfox、Swagger
  10. CentOS下MySQL忘记root密码解决方法【转载】