交换机(exchange):

声明交换机:

Name

Durability (消息代理重启后,交换机是否还存在)

Auto-delete (当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它)

Arguments(依赖代理本身)

交换机状态: 持久(durable)、暂存(transient)

交换机类型:

直连交换机(direct exchange): (empty string) and amq.direct/名字绑定到同名的队列

默认交换机(=direct exchange): empty string/名字为""的直连交换机

扇型交换机(fanout exchange): amq.fanout/交换机会将消息的拷贝分别发送给这所有的N个队列

主题交换机(topic exchange): amq.topic/路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。

头交换机(headers exchange): amq.match/headers头

队列(queue):

声明队列:

Name

Durable(消息代理重启后,队列依旧存在)

Exclusive(只被一个连接(connection)使用,而且当连接关闭后队列即被删除)

Auto-delete(当最后一个消费者退订后即被删除)

Arguments(一些消息代理用他来完成类似与TTL的某些额外功能)

队列状态:

持久化队列(Durable queues):broker重启的时候,它依旧存在

暂存队列(Transient queues):

绑定(Binding): 交换机(exchange)将消息(message)路由给队列(queue)所需遵循的规则

如果AMQP的消息无法路由到队列(例如,发送到的交换机没有绑定队列),消息会被就地销毁或者返还给发布者。

*消息确认:

confirm模式:

将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。

一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一ID)。

如果RabbitMQ发生内部错误从而导致消息丢失,会发送一条nack(not acknowledged,未确认)消息。

发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。

避免重复:

在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列;

在消息消费时,要求消息体中必须要有一个bizId(对于同一业务全局唯一,如支付ID、订单ID、帖子ID等)作为去重的依据,避免同一条消息被重复消费。

(1)当拒绝某条消息时,应用可以告诉消息代理如何处理这条消息——销毁它或者重新放入队列。

(2)当此队列只有一个消费者时,请确认不要由于拒绝消息并且选择了重新放入队列的行为而引起消息在同一个消费者身上无限循环的情况发生。

消息(最大64b):

Content type(内容类型)

Content encoding(内容编码)

Routing key(路由键)

Delivery mode (persistent or not)

投递模式(持久化 或 非持久化)

Message priority(消息优先权)

Message publishing timestamp(消息发布的时间戳)

Expiration period(消息有效期)

Publisher application id(发布应用的ID)

虚拟主机(virtual hosts):

为了在一个单独的代理上实现多个隔离的环境,当连接被建立的时候,AMQP客户端来指定使用哪个虚拟主机

use API:

Basic:

basic.publish(): 发送消息

basic.ack(): 对一条或多条消息发布成功与否进行确认

basic.cancel():

basic.consume():

basic.deliver():

basic.get(): 直接访问队列

basic.nack(): 被拒绝的是否重新入队列

basic.qos(): Quality of Service服务质量,告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该consumer将block掉,直到有消息ack

basic.recover(): 重入队列,是否发送给同一个消费者

basic.recover-async():

basic.reject(): 被拒绝的是否重新入队列

basic.return():

Exchange:

exchange.bind(): 此方法为RabbitMQ特有的AMQP扩展将两个交换机进行绑定。

*exchange.declare(): 验证交换机是否存在,不存在则新建,存在则使用。

exchange.delete(): 此方法用于删除交换机。当一个交换机被删除后,与其绑定的所有队列都会被清除。

exchange.unbind(): 此方法为RabbitMQ特有的AMQP扩展解除两个交换机之间的绑定关系。

Queue:

queue.bind(): 将队列绑定到交换机。

*queue.declare(): 声明队列,如果队列不存在创建,存在则使用。

queue.delete(): 删除队列。如果服务器设置了死信队列(dead-letter queue),当队列被某个删除时,

任何依存于此队列的消息都会被发送到死信队列中,队列上的所有消费者都会被清除掉。

queue.purge(): 清空队列。此方法会将队列中的所有不处于等待 确认回执(acknowledgment)状态的消息全部移除。

queue.unbind(): 解除队列与交换机的绑定。

*生命周期: 这个扩展决定了一条消息从发布到被服务器丢弃的生存时间。此方法中设置生存时间的参数为 x-message-ttl。

*过期时间: 队列可以在声明时指定租约时限。租约时限指的是如果队列一直未被使用,多久之后服务器会将其自动删除。租约时限由此方法的x-expires参数指定。

Tx(事务):

tx.commit() ➔ commit-ok: 提交事务。

tx.rollback() ➔ rollback-ok: 回滚事务。

tx.select() ➔ select-ok: 选择标准事务模式。

消息丢失、重复:

发送阶段:

(1)事务批量回滚。

(2)开启消息确认confirm模式,同步可重发固定次数,超过次数手动处理,异步可以用db记录发送数据,若为nack时重发并记录重发次数。

队列阶段:

防止机器挂掉,将交换机、队列、消息全部持久化到磁盘。

消费阶段:

(1)若消息发送到mq后由于网络波动,发送者未收到确认,可能触发重试机制导致队列存在消息重复。

(2)消息重复:

a.消息源多条: 采用消息唯一识别码,db数据库建唯一主键、使用redis原子操作、db记录消息处理状态。

b.消费时,已将消息消费未来得及返回ack时出现异常,改为手动ack,try异常后查询数据库订单状态是否改变。

rabittmq详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. web安全之点击劫持

    点击劫持(ClickJacking)是一种视觉上的欺骗手段.大概有两种方式, 一是攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在该页面上进行操作,此时用户将在不知情的情况下点击透明 ...

  2. hydra暴力破解

    hydra,是一个非常好用的暴力破解工具,而且名字也很cool. 下面是官网上的介绍: AFP, Cisco AAA, Cisco auth, Cisco enable, CVS, Firebird, ...

  3. CSS中重要的BFC

    CSS中有个重要的概念BFC,搞懂BFC可以让我们理解CSS中某些原本看似诡异的地方. 简介 在解释BFC之前,先说一下文档流.我们常说的文档流其实分为定位流.浮动流.普通流三种.而普通流其实就是指B ...

  4. margin与padding的区别与用法—以及出现bug的解决方法

    margin(外边距) padding(内边距)   一.语法结构 (1)margin-left:10px; 左外边距 (2)margin-right:10px; 右外边距 (3)margin-top ...

  5. php架构师都要会什么

    架构师的成长离不开踩坑,不断试验各种方案,各种踩坑,从小坑到大坑,逐渐归纳.另外就是多学习多交流,兼收并蓄,不用特别在意细节,观其大略,了解常见的各种东西的核心价值与短板所在.一个程序和计算系统软件体 ...

  6. window下设置定时任务及基本配置

    ### window下设置定时任务及基本配置 轉載請註明出處: https://www.cnblogs.com/funnyzpc/p/11746439.html |****************** ...

  7. LeetCode 2: single-number II

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  8. 个人记账app(一)需求设计

    时间如流水,只能流去不流回. 学历代表你的过去,能力代表你的现在,学习能力代表你的将来. 学无止境,精益求精. 一.开发背景 Android应用市场记账的app那么多,我为什么还要再开发一个呢?重复造 ...

  9. 5.分析snkrs的Android的DeviceID生产规则

    分析Android的DeviceID生产 前面已经把web端的分析了一些,要想实现其实容易也难,容易是规则很容易,难是时间生成控制很难,我之前大概花了一周时间分析和梳理,然后行为测试,之前我已经讲过c ...

  10. js控制进度条数据

    <style><!-- #time{ width:500px; height: 20px; background: red; border-radius: 10px; } --> ...