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(父进程与子进程进行交互或 ...
随机推荐
- react 写一个贪吃蛇
示例: 全部代码如下: snake.jsx import React, { Component } from 'react'; import PropTypes from 'prop-types'; ...
- 迭代器模式(java版)
迭代器模式的组成部分 Aggregate(抽象聚合类) 它用于存储和管理元素对象,声明一个createiterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色. ConcreteAggr ...
- vuex的使用二
1.先看项目的目录结构 2.在main.js里需要引入store这个文件并挂在实例上 import store from './store/store' ............ new Vue({ ...
- InstallShield2015制作安装包----------安装过程中修改文件内容
//修改安装目录下autostart.vbs里的路径 //打开文件 OpenFileMode(FILE_MODE_NORMAL); strPath=INSTALLDIR+"centerAut ...
- db2字符串相关函数的使用
db2字符串相关函数的使用 from :internet 一.字符转换函数 1.ASCII() 返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘’括起来 ...
- BestCoder Round #55 ($)
C 构造一个矩阵,然后采用矩阵快速幂 #include <iostream> #include <algorithm> #include <string.h> #i ...
- spring 的核心类JdbcTemplate 方法
2018-11-29 10:28:02
- 获取数据库连接对象Connection
2018-11-04 19:50:52 开始写 public Connection getConn() {//返回类型为Connection try { Class.forName("co ...
- CBV源码解析
1.CBV(class based view) 首先定义一个视图函数,用类的方式定义: 举例: class LoginView(View): def get(self,request): return ...
- Gibbs Sampling深入理解
二维Gibbs Sampling算法 Gibbs Sampling是高维概率分布的MCMC采样方法.二维场景下,状态(x, y)转移到(x’, y’),可以分为三种场景 (1)平行于y轴转移,如上图中 ...