rabbitmq之确保消息不丢失
1、背景引入
在使用消息中间件(rabbitmq)时,令开发者最头痛的就是防止消息丢失问题,而消息丢失可能发生的位置主要为三种,分别为(1)消息发送到MQ中消费者消费未成功时突然宕机;(2)消息发送到MQ中MQ集群整体宕机;(3)消息发送到队列但未持久化到磁盘前MQ集群整体宕机
2、解决消息发送到MQ中消费者消费未成功时宕机问题
对于稍微了解RabbitMQ的开发者而言一定会知道RabbitMQ中ack消息确认机制,默认情况下只要消息从队列中发送到消费者,队列就会将消息删除,此时将会出现以上所说的第一种情况,这时就需要开发者在消费者代码中将ack参数设置为True,这样消息在完全消费以后将会返回给MQ一个确定的应答,通知MQ可以将这条消息删除了,但是还会出现一种情况,消费者服务端没宕机而是消息格式不正确等错误引起的消费失败,这时如果还返回ack则会出现消息丢失问题,所以应该在消费者代码中加入判断机制,未消费成功返回nack,手动ack机制之下的架构图如下所示:
3、解决消息发送到MQ中MQ集群整体宕机问题
默认情况下RabbitMQ的queue和message都没采用持久化的方式进行投递,所以MQ集群重启将会导致部分消息丢失,因此可以采用持久化的方式创建queue,同时采用持久化的方式发送消息到MQ集群,这样MQ集群将会吧消息持久化到磁盘中。此时如果消息还没来得及投递给消费者服务,然后MQ集群突然宕机了,数据是不会丢失的,因为MQ集群重启之后会自动从磁盘文件里加载出来没投递出去的消息,然后继续投递给消费者服务。同样,该方案沉淀下来的系统架构图,如下所示:
4、解决消息发送到队列但未持久化到磁盘前MQ集群整体宕机问题
一个最大的问题,就是生产者投递出去的消息,可能会丢失。丢失的原因有很多,比如消息在网络传输到一半的时候因为网络故障就丢了,或者是消息投递到MQ的内存时,MQ突发故障宕机导致消息就丢失了。针对这种生产者投递数据丢失的问题,RabbitMQ实际上是提供了一些机制的。比如,有一种重量级的机制,就是事务消息机制。采用类事务的机制把消息投递到MQ,可以保证消息不丢失,但是性能极差,经过测试性能会呈现几百倍的下降。所以说现在一般是不会用这种过于重量级的机制,而是会用轻量级的confirm机制。但是我们这篇文章还不能直接讲解生产者保证消息不丢失的confirm机制,因为这种confirm机制实际上是采用了类似消费者的ack机制来实现的。相关代码实现如下:
同样,该方案沉淀下来的系统架构图,如下所示:
rabbitmq之确保消息不丢失的更多相关文章
- RabbitMQ 如何保证消息不丢失?
RabbitMQ一般情况很少丢失,但是不能排除意外,为了保证我们自己系统高可用,我们必须作出更好完善措施,保证系统的稳定性. 下面来介绍下,如何保证消息的绝对不丢失的问题,下面分享的绝对干货,都是在知 ...
- 如何保证RabbitMQ的消息不丢失及其背后的原理
一.消息为什么丢失 RabbitMQ默认情况下的交换机和队列以及消息是非持久化的,也就是说在服务器重启或者宕机恢复后,之前创建的交换机和队列都将不复存在,之前未消费的消息也就消失不见了.原因在于每个队 ...
- RabbitMq如何确保消息不丢失
上篇写了掌握Rabbitmq几个重要概念,从一条消息说起,这篇来总结关于消息丢失让人头痛的事情.网络故障.服务器重启.硬盘损坏等都会导致消息的丢失.消息从生产到消费主要结果以下几个阶段如下图. ①生产 ...
- 基于springboot工程浅谈整合rabbitmq怎么样防止消息发送mq不丢失和消费mq的消息防止丢失
本文只针对springboot整合rabbitmq的消息防丢失,话不多说,上干货.... 设置发送mq消息不丢失实现思路 执行的方案: 第一步,要对队列,消息以及交换机进行持久化操作(保存到物理磁盘中 ...
- rabbitmq如何保证消息可靠性不丢失
目录 生产者丢失消息 代码模拟 事务 confirm模式确实 数据退回监听 MQ事务相关软文推荐 MQ丢失信息 消费者丢失信息 之前我们简单介绍了rabbitmq的功能.他的作用就是方便我们的消息解耦 ...
- rabbitMQ学习1:消息队列介绍与rabbitmq安装使用
1. 什么是消息队列 生活里的消息队列,如同邮局的邮箱, 如果没邮箱的话, 邮件必须找到邮件那个人,递给他,才玩完成,那这个任务会处理的很麻烦,很慢,效率很低 但是如果有了邮箱, 邮件直接丢给邮箱,用 ...
- (转)RabbitMQ学习之消息可靠性及特性
http://blog.csdn.net/zhu_tianwei/article/details/53971296 下面主要从队列.消息发送.消息接收方面了解消息传递过的一些可靠性处理. 1.队列 消 ...
- RabbitMQ如何保证消息99.99%被发送成功?
1. 本篇概要 RabbitMQ针对这个问题,提供了以下几个机制来解决: 生产者确认 持久化 手动Ack 本篇博客我们先讲解下生产者确认机制,剩余的机制后续单独写博客进行讲解. 2. 生产者确认 要想 ...
- 关于MQ的几件小事(四)如何保证消息不丢失
1.mq原则 数据不能多,也不能少,不能多是说消息不能重复消费,这个我们上一节已解决:不能少,就是说不能丢失数据.如果mq传递的是非常核心的消息,支撑核心的业务,那么这种场景是一定不能丢失数据的. 2 ...
随机推荐
- Android版数据结构与算法(四):基于哈希表实现HashMap核心源码彻底分析
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 存储键值对我们首先想到HashMap,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞,它是线程不安全的,并且存储的key只能有一个为 ...
- 第15章 时间常数字符串比较 - IdentityModel 中文文档(v1.0.0)
在比较安全上下文中的字符串(例如比较键)时,应尽量避免泄漏时序信息. 该TimeConstantComparer类可以帮助: var isEqual = TimeConstantComparer.Is ...
- C# 23种设计模式
目录 0).简单工厂模式 1).工厂方法模式 2).抽象工厂模式 3).单例模式 4).构建者模式 5).原型模式 6).适配器模式 7).修饰者模式 8).代理模式 9).外观模式 10).桥接模式 ...
- Java对象引用/JVM分级引用——强引用、软引用、弱引用、虚引用
无论是通过引用计数法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判断对象是否存活都与“引用”有关, 相关资料:如何判断对象是否存活/死去 那么引用究竟是什么?让我们一起来看一下 ...
- AMBARI Blueprint 使用文档
Introduction Notable JIRAs API Resources and Syntax Blueprint Usage Overview Step 0: Prepare Ambari ...
- 使用清华开源镜像安装tensorflow
安装tensorflow时,如果使用直接安装速度相对较慢,采取清华大学的镜像会提高速度.GPU版本安装方法:pip install tensorflow-gpu==1.8 -i https://pyp ...
- javascript 实现数据结构 - 栈
栈是一种遵从后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.栈就好像是一个底部密封的盒子,我们往里面 ...
- ASP.NET Core 使用 SignalR 遇到的 CORS 问题
问题 将 SignalR 集成到 ASP.NET Core MVC 程序的时候,按照官方 DEMO 配置完成,但使用 DEMO 页面建立连接一直提示如下信息. Access to XMLHttpReq ...
- ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
一.前言 最近一段时间自己主要的学习计划还是按照毕业后设定的计划,自己一步步的搭建一个前后端分离的 ASP.NET Core 项目,目前也还在继续学习 Vue 中,虽然中间断了很长时间,好歹还是坚持 ...
- .NET Core微服务之基于Steeltoe使用Hystrix熔断保护与监控
Tip: 此篇已加入.NET Core微服务基础系列文章索引 => Steeltoe目录快速导航: 1. 基于Steeltoe使用Spring Cloud Eureka 2. 基于Steelt ...