那些情况会失败

网络问题有很多原因出发失败。防火墙也可能会中断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. Linux虚拟文件系统

    从文件 I/O 看 Linux 的虚拟文件系统 1 引言 Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等.通过使用同一套文件 I/O 系统 调用即可对 Linux ...

  2. oracle本地编译问题

    oracle10.2: --将过程重新编译为本地编译方式,提示有编译错误,经查提示未设置plsql_native_library_dir 参数 SQL> alter procedure p_xx ...

  3. 【Vegas原创】查询SQL Server更改记录的语句

    指定数据库,然后: select Name,Create_date,Modify_Date from sys.objects where type in ('U','P', 'V','F', 'TR' ...

  4. Spark Scheduler内部原理剖析

    文章正文 通过文章“Spark 核心概念RDD”我们知道,Spark的核心是根据RDD来实现的,Spark Scheduler则为Spark核心实现的重要一环,其作用就是任务调度.Spark的任务调度 ...

  5. PHP可变参数

    0x00 缘起 在laravel的源码里经常可以看到下面的函数形式 $func(...$args) 0x01 可变参数旧写法 这表示$func支持可变参数,在php5.6之前则是在函数体内调用 fun ...

  6. [译]Godot 引擎 GDNative 架构初探

    GDNative的架构从最早叫"DLScript"的时候到目前为止已经发生了很大的变化.随着Godot 3.0版本接近最终发布以及API越来越稳定,是时候对GDNative目前的形 ...

  7. Cisco VLAN ACL配置

    什么是ACL? ACL全称访问控制列表(Access Control List),主要通过配置一组规则进行过滤路由器或交换机接口进出的数据包, 是控制访问的一种网络技术手段, ACL适用于所有的被路由 ...

  8. 移除input在type="number"时的上下箭头

    网页在有些情况下,会需要input的输入的为单纯数字的文本框,此时type=number,但使用type=number时,输入框后面会有一个上下箭头,那么如何去掉上下箭头呢? <input ty ...

  9. [Node.js] 04 - Event and Callback

    回调函数 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数. 异步读取文件的回调函数: var fs = require("fs&quo ...

  10. 我的Mac Pro coding环境配置

    新装了OS X 10.11.1. 记录一下开发用得到的一些玩意,方便下次再次配置. homebrew国内源:http://mirrors.tuna.tsinghua.edu.cn/help/#home ...