非集群下,简单的说:
- 如果是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属性以及消息可靠传输设计的更多相关文章

  1. SpringBoot 整合 RabbitMQ 实现消息可靠传输

    消息的可靠传输是面试必问的问题之一,保证消息的可靠传输主要在生产端开启 comfirm 模式,RabbitMQ 开启持久化,消费端关闭自动 ack 模式. 环境配置 SpringBoot 整合 Rab ...

  2. Python自动化 【第十一篇】:Python进阶-RabbitMQ队列/Memcached/Redis

     本节内容: RabbitMQ队列 Memcached Redis 1.  RabbitMQ 安装 http://www.rabbitmq.com/install-standalone-mac.htm ...

  3. Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  4. RabbitMQ队列/Redis缓存

    一.RabbitMQ队列 RabbitMQ安装(Centos7安装):1.安装依赖:yum install socat (不安装会报错)2.下载rpm包:wget http://www.rabbitm ...

  5. 异步IO\数据库\队列\缓存\RabbitMQ队列

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  6. Day10-Python3基础-协程、异步IO、redis缓存、rabbitMQ队列

    内容目录: Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko S ...

  7. Python之协程、异步IO、redis缓存、rabbitMQ队列

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  8. python学习笔记-(十五)RabbitMQ队列

    rabbitMQ是消息队列:想想之前的我们学过队列queue:threading queue(线程queue,多个线程之间进行数据交互).进程queue(父进程与子进程进行交互或者同属于同一父进程下的 ...

  9. Python开发【十一章】:RabbitMQ队列

    RabbitMQ队列 rabbitMQ是消息队列:想想之前的我们学过队列queue:threading queue(线程queue,多个线程之间进行数据交互).进程queue(父进程与子进程进行交互或 ...

随机推荐

  1. [Java in NetBeans] Lesson 12. Arrays

    这个课程的参考视频和图片来自youtube. 主要学到的知识点有: 1. Array: container that holds a fixed number of values of the sam ...

  2. Entity Framework学习初级篇3--LINQ TO Entities

    LINQ 技术(即LINQ to Entities)使开发人员能够通过使用LINQ 表达式和LINQ 标准查询运算符,直接从开发环境中针对实体框架对象上下文创建灵活的强类型查询.LINQ to Ent ...

  3. iOS 第三方框架-Masonry

    介绍地址:http://www.cocoachina.com/ios/20141219/10702.html 官网:https://github.com/SnapKit/Masonry 记住:一定要先 ...

  4. Spring框架第一天

    ## 今天课程:Spring框架第一天 ## ---------- **Spring框架的学习路线** 1. Spring第一天:Spring的IOC容器之XML的方式,Spring框架与Web项目整 ...

  5. git 语法

    $ git init  // 初始化一个Git仓库 会生成一个.git目录 $ git status   // 查看仓库的状态 $ git add .   // 将所有修改添加到暂存区 $git ad ...

  6. bat cmd 获取管理员权限

    @ echo off % % ver|find "5.">nul&&goto :Admin mshta vbscript:createobject()(win ...

  7. JavaScript 字符串replace全局替换

    一般使用replace let str = "2018-8-14"; str.replace('-','/')//2018/8-14 并没有替换第二个”-“, 所以我们用正则表达式 ...

  8. 010-判断是否回传IsPostBack属性

    属性IsPostBack:判断是否回传 如果是第一次请求,则返回false 如果是回传请求,则返回true->说明:只有使用服务器端表单才可以正常使用IsPostBack->使用情境:当在 ...

  9. not value specified for parameter问题解决方案

    前段时间遇到这个问题找了半天没有找到,今天又调试了突然发现出现这个问题的根本原因是sql语句中的参数没有赋值或者参数类型与数据库字段类型不匹配所导致的. 例如: String sql = " ...

  10. lua元表学习

    a = {, } b= {, } vector2 = {} function vector2.Add(v1, v2) if(v1 == nil or v2 == nil)then return nil ...