RabbitMQ消息可靠性
那些情况会失败
网络问题有很多原因出发失败。防火墙也可能会中断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消息可靠性的更多相关文章
- RabbitMQ消息可靠性分析和应用
RabbitMQ流程简介(带Exchange) RabbitMQ使用一些机制来保证可靠性,如持久化.消费确认及发布确认等. 先看以下这个图: P为生产者,X为中转站(Exchange),红色部分为消息 ...
- RabbitMQ消息可靠性分析
消息中间件的可靠性是指对消息不丢失的保障程度:而消息中间件的可用性是指无故障运行的时间百分比,通常用几个 9 来衡量.不存在绝对的可靠性只能尽量趋向完美.并且通常可靠性也意味着影响性能和付出更大的成本 ...
- RabbitMQ消息可靠性分析 - 简书
原文:RabbitMQ消息可靠性分析 - 简书 有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就 ...
- [转载]RabbitMQ消息可靠性分析
有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就能够叙述明白的,包括Kafka也是如此.可靠并不 ...
- RabbitMQ消息可靠性传输
消息的可靠性投递是使用消息中间件不可避免的问题,不管是使用kafka.rocketMQ或者rabbitMQ,那么在RabbitMQ中如何保证消息的可靠性投递呢? 先再看一下RabbitMQ消息传递的流 ...
- RabbitMQ消息可靠性、死信交换机、消息堆积问题
目录 消息可靠性 生产者消息确认 示例 消费者消息确认 示例 死信交换机 例子 高可用问题 消息堆积问题 惰性队列 参考 消息可靠性 确保消息至少被消费了一次(不丢失) 消息丢失的几种情况: 消息在网 ...
- 消息中间件-RabbitMQ消息可靠性和插件化机制
package com.study.rabbitmq.a132.confirm; import com.rabbitmq.client.*; import java.io.IOException; i ...
- 解决RabbitMQ消息丢失问题和保证消息可靠性(一)
原文链接(作者一个人):https://juejin.im/post/5d468591f265da03b810427e 工作中经常用到消息中间件来解决系统间的解耦问题或者高并发消峰问题,但是消息的可靠 ...
- SpringCloud之RabbitMQ消息队列原理及配置
本篇章讲解RabbitMQ的用途.原理以及配置,RabbitMQ的安装请查看SpringCloud之RabbitMQ安装 一.MQ用途 1.同步变异步消息 场景:用户下单完成后,发送邮件和短信通知. ...
随机推荐
- [转]Linux性能分析工具汇总合集
出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...
- Atitit 常见每日流程日程日常工作.docx v4
Atitit 常见每日流程日程日常工作.docx v4 ----早晨 签到 晨会,每天或者隔天 每日计划( )项目计划,日常计划等. mailbox读取检查 每日趋势 推库 -----下午 签退 每日 ...
- rocketmq 源码
https://github.com/YunaiV/incubator-rocketmq
- git 创建标签
在Git中打标签非常简单,首先,切换到需要打标签的分支上: $ git branch * dev master $ git checkout master Switched to branch 'ma ...
- Maven使用详解,非常详细
本文转:http://blog.csdn.net/u010425776/article/details/52027706 什么是Maven? 如今我们构建一个项目需要用到很多第三方的类库,如写一个使用 ...
- ElasticSearch性能优化策略【转】
ElasticSearch性能优化主要分为4个方面的优化. 一.服务器部署 二.服务器配置 三.数据结构优化 四.运行期优化 一.服务器部署 1.增加1-2台服务器,用于负载均衡节点 elasticS ...
- vue.js是什么
Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习, ...
- QT QQuickView嵌入到QT MDI中
在学习QT的过程中发现有一个特别炫酷的行星例子“planets”,有两种实现版本: 一种是基于Qt 3D QML(planets-qml),另一种则是基于Quick和强大的Three.js(plane ...
- 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V4 -- 粘包拆包
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- new LengthFieldPrepender(2) : 设置数据包 2 字节的特征码 new LengthFieldB ...
- Ubuntu下SSH无密码验证配置
前言 SSH为Secure Shell 的缩写,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.越来越多的小伙伴们使用远程登录,而ssh安全性无疑是很高的,那么我们现在来看看如何实现ss ...