那些情况会失败

网络问题有很多原因出发失败。防火墙也可能会中断Idle连接,网络失败不是很快确定的。 硬件和软件也会导致系统崩溃。客户端软件保持运行,而逻辑错误也可能会导致channel和connection错误。这就要求我们可以恢复new channel或者connection从这个问题中。

Connection 失败

Connection失败后,客户端需要重新构建一个新的Connection。任何之前打开的Channel会重新打开。

会有特定的异常抛出,例如Java 提供了ShutdownListener和DotNet提供的Iconnection.ConnectionShutdown时间。

确认和提交(Acknowledgements and Confirms)

当连接失败,消息可能在客户端和服务器端之间进行传输。 确认可以让服务器和客户端之间知道彼此的状态。 在RabbitMQ中,Consumer与服务器之间确认行为叫做"Acknowledgements",而Producer与服务器之间确认行为叫做“Confirms”。

Acknowledgements的场景:消费软件不确认这个消息,直到它使用接受到的消息,完成自己的工作。一旦Broker接受到这个消息确认信息,将清除这个消息。

Confirms的场景:当Broker接受到不能路由的消息,并且消息被设置为mandatory,消息basic.return会在basic.ack之前返回。对于路由之后的消息,basic.ack会让所有接受到这个消息的数据,存储到磁盘中。对于镜像队列来说(Mirrored Queue),会让所有镜像都统一确认这些消息。

心跳

部分网络问题,包的丢失可能是由于操作系统破坏了TCP链接。AMQP使用心跳的特征在软件层次检测链接是否被破坏了。心跳也会阻止一些网络设备阻止当前“idle”tcp链接。 broker会协商连接的heartbeat的频率。

对于Producer(消息生产者)

当使用confirm时候,如果channel或者connection失败,Producer应该重新发送所有没有来得及提交的数据。

这里可能会造成数据重复,因为服务器broker可能已经发送确认数据到Producer了。因此consumer应用可以处理重复数据,保持一个幂等的状态。(幂等状态是指,无论consumer处理了几次相同的数据,结果都是一样的。例如:x=2是幂等。x=x+2就不是幂等)

确定消息是被路由的

producer应该保证发送的消息被路由(Router)到队列中(Queues). 为了保证producer发送消息可以被最少一条队列接受(Queue),我们在发送消息的时候,必须设置mandatory标示,在发送消息时候(AMQP的协议对应basic.publish,Java的版本对应Channel.basicPublish方法)。当消息没有被队列接受时,我们可以通过返回值(AMQP协议的basic.return)获得一个返回码和其他文本数据。

Producer也应该认识到发送消息到集群中,集群之间都需要复制消息。也增加了网络失败造成的延时情况。

对于Consumer(对于消费者)

如果一个消息发送到Consumer,而Consumer没有确认并且Connection中断,那么这个消息重新进入队列,再次发送出去之后,会有一个redelivedred标签。帮助Consumer的应用判断当前数据是否重复发送。

Consumer取消

Consumer取消是服务器端发起,告诉Consumer当前消费被终止了。Consumer取消发起的原因:当前的Queue被删除,或者其他失败情况。这是Rabbitmq的一个扩展,部分客户端才能支持。(Java和DotNet都支持)。

消息不能被处理

consumer可以发送消息给服务端,告知消息被拒绝(AMQP的basic.reject和basic.nack),让服务器重新发送他们,或者根据dead-letter参数参数。(dead-letter是配置Exchange和Queue时候配置的参数,我们可以进行相关的设置)。

分布式下的RabbitMQ

当网络不稳定的时候,使用federation和shovel来实现功能。我们也可以配置他们实现confirm和acknowledgement功能。

RabbitMQ消息可靠性的更多相关文章

  1. RabbitMQ消息可靠性分析和应用

    RabbitMQ流程简介(带Exchange) RabbitMQ使用一些机制来保证可靠性,如持久化.消费确认及发布确认等. 先看以下这个图: P为生产者,X为中转站(Exchange),红色部分为消息 ...

  2. RabbitMQ消息可靠性分析

    消息中间件的可靠性是指对消息不丢失的保障程度:而消息中间件的可用性是指无故障运行的时间百分比,通常用几个 9 来衡量.不存在绝对的可靠性只能尽量趋向完美.并且通常可靠性也意味着影响性能和付出更大的成本 ...

  3. RabbitMQ消息可靠性分析 - 简书

    原文:RabbitMQ消息可靠性分析 - 简书 有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就 ...

  4. [转载]RabbitMQ消息可靠性分析

    有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就能够叙述明白的,包括Kafka也是如此.可靠并不 ...

  5. RabbitMQ消息可靠性传输

    消息的可靠性投递是使用消息中间件不可避免的问题,不管是使用kafka.rocketMQ或者rabbitMQ,那么在RabbitMQ中如何保证消息的可靠性投递呢? 先再看一下RabbitMQ消息传递的流 ...

  6. RabbitMQ消息可靠性、死信交换机、消息堆积问题

    目录 消息可靠性 生产者消息确认 示例 消费者消息确认 示例 死信交换机 例子 高可用问题 消息堆积问题 惰性队列 参考 消息可靠性 确保消息至少被消费了一次(不丢失) 消息丢失的几种情况: 消息在网 ...

  7. 消息中间件-RabbitMQ消息可靠性和插件化机制

    package com.study.rabbitmq.a132.confirm; import com.rabbitmq.client.*; import java.io.IOException; i ...

  8. 解决RabbitMQ消息丢失问题和保证消息可靠性(一)

    原文链接(作者一个人):https://juejin.im/post/5d468591f265da03b810427e 工作中经常用到消息中间件来解决系统间的解耦问题或者高并发消峰问题,但是消息的可靠 ...

  9. SpringCloud之RabbitMQ消息队列原理及配置

    本篇章讲解RabbitMQ的用途.原理以及配置,RabbitMQ的安装请查看SpringCloud之RabbitMQ安装 一.MQ用途 1.同步变异步消息 场景:用户下单完成后,发送邮件和短信通知. ...

随机推荐

  1. 10.1.翻译系列:EF 6中的实体映射【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/configure-entity-mappings-using-fluent-api.a ...

  2. HTML5中的History对象

    HTML5标准之前 基本操作 1.forward(number) 加载histroy列表中的下一个URL 2.back(number) 加载histroy列表中的上一个URL 3.go(number) ...

  3. 搞定所有的跨域请求问题 jsonp CORS

    网上各种跨域教程,各种实践,各种问答,除了简单的 jsonp 以外,很多说 CORS 的都是行不通的,老是缺那么一两个关键的配置.本文只想解决问题,所有的代码经过亲自实践.   本文解决跨域中的 ge ...

  4. Nginx 限制访问速率

    本文测试的nginx版本为nginx version: nginx/1.12.2 Nginx 提供了 limit_rate 和limit_rate_after,举个例子来说明一下在需要限速的站点 se ...

  5. CentOS 7 安装SVN服务端

    CentOS7下安装SVN服务 1. yum命令即可方便的完成安装# sudo yum install subversion 测试安装是否成功:# svnserve --version 更改svn的默 ...

  6. android开发的童鞋们 你该学点C++

    更多关于C++的知识点,请关注android开发应该学点C++(索引贴)android开发应该学点C++(其他) (*android开发论坛----android开发学习----android开发*) ...

  7. 将png图片转换为字体图标

    字体图标不仅可以随意调整大小,而且可以避免在页面制作过程中引用N多的图片,发送请求造成的流量浪费,因此,我们可以将图标的icon转换成字体图标: 方法一: 1.将png格式的图片转换成svg格式: 网 ...

  8. 【转】ELK到底是什么鬼?辣么多公司用!

    Sina.饿了么.携程.华为.美团.freewheel.畅捷通 .新浪微博.大讲台.魅族.IBM...... 这些公司都在使用ELK!ELK!ELK! ELK竟然重复了三遍,是个什么鬼?     一. ...

  9. idea java 非web程序打包

    以下打包非常暴力.O(∩_∩)O哈哈~ 方法一: 第一步:选择需要打包的程序 第二步:选择需要打包的文件 第三步:artifacts->jar->from modules with... ...

  10. windows server 2008 R2 计划任务备份系统

    实验环境拓扑图: 实验效果: Windows Server Backup 可以设置备份计划,但只能按日进行备份,不能设置按周或月进行备份.所以,需要使用到 windows Server 2008 R2 ...