rabbitmq队列的exclusive,durability,auto-delete属性以及消息可靠传输设计
非集群下,简单的说:
- 如果是excl,则设置durability没有意义,因为不管服务器挂了还是客户端主动/被动断开了,队列都会自动删除。
- auto-delete,其实可简单的认为是同理,即使非excl,则无论是服务器挂了还是全部消费者断开了,队列都会删除。
集群下:
这还真得测试如下:
1、A服务器挂了,客户端连接从A自动切换到B之后(即使配置了多个,任何时候MQ仍然只是连接到一个),MQ服务器是否认为仍然是原来的消费者?从理论上来说,应该是要认为相同的,不然就失去了集群的意义。
2、服务不是在客户端设置多个地址,而是通过haproxy进来的(不过一般大规模来说,应该使用TCP负载均衡器,小规模可能运维考虑不用),此时又是什么样的含义。
关于可靠传输,发布、订阅端发送后没有收到ack/confirm时的业务状态一致性判断问题,通常来说靠协议自身去实现100%可靠性是很难的(总要有补偿机制兜底),主要要应用层去如何设计以最小化开发/维护/运行时成本的处理。
ACK:消费者->RabbitMQ的消息处理确认
confirm:RabbitMQ->发布者的消息收到确认(AMQP标准里面用事务,太重量级)
ACK+confirm+persistent是确保消息可信到达唯一条件,即使如此,仍然有可能存在链路上的问题。如下:
publish,未收到confirm客户端挂了,服务器已成 业务可重复执行(尤其是如果生产者是整个链路的中间环节)
publish,未收到confirm服务器挂了,服务器已成 业务可重复执行(尤其是如果生产者是整个链路的中间环节)
publish,未收到confirm客户端挂了,服务器未成 无需处理,理论上不可能发生
publish,未收到confirm服务器挂了,服务器未成 客户端处理异常
consume,未收到ack客户端挂了,客户端已成 业务可重复执行(尤其是如果消费者是整个链路的中间环节)
consume,未收到ack服务器挂了,客户端已成 业务可重复执行(尤其是如果消费者是整个链路的中间环节)
consume,未收到ack客户端挂了,客户端未成 无需处理,服务端自动重发
consume,未收到ack服务器挂了,客户端未成 无需处理,理论上不可能发生
同时要考虑集群下是否完全一致。
rabbitmq队列的exclusive,durability,auto-delete属性以及消息可靠传输设计的更多相关文章
- SpringBoot 整合 RabbitMQ 实现消息可靠传输
消息的可靠传输是面试必问的问题之一,保证消息的可靠传输主要在生产端开启 comfirm 模式,RabbitMQ 开启持久化,消费端关闭自动 ack 模式. 环境配置 SpringBoot 整合 Rab ...
- Python自动化 【第十一篇】:Python进阶-RabbitMQ队列/Memcached/Redis
本节内容: RabbitMQ队列 Memcached Redis 1. RabbitMQ 安装 http://www.rabbitmq.com/install-standalone-mac.htm ...
- Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列
Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...
- RabbitMQ队列/Redis缓存
一.RabbitMQ队列 RabbitMQ安装(Centos7安装):1.安装依赖:yum install socat (不安装会报错)2.下载rpm包:wget http://www.rabbitm ...
- 异步IO\数据库\队列\缓存\RabbitMQ队列
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...
- Day10-Python3基础-协程、异步IO、redis缓存、rabbitMQ队列
内容目录: Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko S ...
- Python之协程、异步IO、redis缓存、rabbitMQ队列
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...
- python学习笔记-(十五)RabbitMQ队列
rabbitMQ是消息队列:想想之前的我们学过队列queue:threading queue(线程queue,多个线程之间进行数据交互).进程queue(父进程与子进程进行交互或者同属于同一父进程下的 ...
- Python开发【十一章】:RabbitMQ队列
RabbitMQ队列 rabbitMQ是消息队列:想想之前的我们学过队列queue:threading queue(线程queue,多个线程之间进行数据交互).进程queue(父进程与子进程进行交互或 ...
随机推荐
- mac-禅道环境
开机不能访问,换成IP地址就好了
- 超实用教程,教你用墨刀做出小红书app原型
一个新手怎么用1小时快速学会APP原型设计? 1小时很短,这意味着学习时必须把握APP原型设计中的重点.难点,而非面面俱到. 要在短时间内理解.掌握一个工具的使用,最有效的方式莫过于临摹: 看实例视频 ...
- ASP.NET 预编译命令(解决发布后第一次访问慢问题)
ASP.NET 编译工具 (Aspnet_compiler.exe) 官方说明 新建bat文件 @echo off CD /d C:\Windows\Microsoft.NET\Framewo ...
- Kotlin provideDelegate
提供委托 这又是一个蛋疼的叫法,其实,就是给A和委托B之间插入一个中间件而已 这个中件间的作用是用了对委托的参数做一个校验 好了,别的不多说,直接给demo import kotlin.reflect ...
- orm查询语法参考文章
1.参考博客 http://blog.csdn.net/OyangYujun/article/details/45938905 ORMLite完全解析(三)官方文档第三章.自定义查询构造器 Custo ...
- Hotfix
http://group.jobbole.com/6311/ http://www.jianshu.com/p/6f0ae1e364d9 http://www.mamicode.com/info-de ...
- shell作业控制(后台前台命令)
ctrl+z暂停命令(任务) fg调回命令 | fg +id号 bg放在后台持续执行 vmstat 1 & 在后面加上‘&’ 即相当于bg jobs列出当前的 ...
- IIS7配置rewriter
遇到的问题就是rewriter不起效果冲IIS6迁移过来的.最后发现是Framework 4.0的原因!记录处理方式为: 一. <configSections> <section n ...
- [openjudge-动态规划]摘花生
题目描述 描述 Hello Kitty 想摘点花生送给她喜欢的米老鼠.她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来.地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生 ...
- 集合List
//数组 存值长度固定,类型固定 //集合 长度不固定,类型也可以不固定 List<int> list = new List<int>(); //list.Add(78); ; ...