交换机(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. 【Java 基础】谈谈集合.List

    目录 1. ArrayList 1.1 ArrayList的构造 1.2 add方法 1.3 remove方法 1.4 查询方法 1.5 一些其他常用方法 1.6 ArrayList小结 2. Vec ...

  2. mysql 延时注入新思路

    转自先知社区https://xz.aliyun.com/t/2288 在4月的pwnhub比赛中,我们遇到了一个比较神奇的问题,如果在注入中遇到需要延时注入的情况,但服务端过滤了我们一般使用的slee ...

  3. 懒要懒到底,能自动的就不要手动,Hibernate正向工程完成Oracle数据库到MySql数据库转换(含字段转换、注释)

    需求描述 需求是这样的:因为我们目前的一个老项目是Oracle数据库的,这个库呢,数据库是没有注释的,而且字段名和表名都是大写风格,比如 在代码层面的po呢,以前也是没有任何注释的,但是经过这些年,大 ...

  4. WPF使用border画框

    以前的界面中使用的框大都是由美工做好的,但是这样就遇到几个问题: 框只是换一个颜色,就需要多做出一张图,资源包中也要多一个图片资源: 文字的数量会改变,用一张固定的图进行拉伸,边角处会变得越来越不尽如 ...

  5. Java 异常处理的 20 个最佳实践,你知道几个?

    异常处理是 Java 开发中的一个重要部分,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java 提供了几个异常处理特性,以try,catch 和 finally 关键字的形式内建 ...

  6. Spring Cloud Alibaba学习笔记(23) - 调用链监控工具Spring Cloud Sleuth + Zipkin

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求陷入性能瓶颈或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何 ...

  7. ASP.NET WebApi+Vue前后端分离之允许启用跨域请求

    前言: 这段时间接手了一个新需求,将一个ASP.NET MVC项目改成前后端分离项目.前端使用Vue,后端则是使用ASP.NET WebApi.在搭建完成前后端框架后,进行接口测试时发现了一个前后端分 ...

  8. vue系列---snabbdom.js使用及源码分析(九)

    一:什么是snabbdom? 在学习Vue或React中,我们了解最多的就是虚拟DOM,虚拟DOM可以看作是一颗模拟了DOM的Javascript树,主要是通过vnode实现一个无状态的组件,当组件状 ...

  9. 你的 Java 并发程序 Bug,100% 是这几个原因造成的

    可见性问题 可见性是指一个线程对共享变量进行了修改,其他线程能够立马看到该共享变量更新后的值,这视乎是一个合情合理的要求,但是在多线程的情况下,可能就要让你失望了,由于每个 CPU 都有自己的缓存,每 ...

  10. linux 基本操作--笔记

    linux 基本操作: pwd 显示当前目录 ll 用于查看文件和目录,即list,其参数比较多 -l 列出数据串,包含文件的属性和权限数据等 -a 列出全部文件,包含隐藏文件 -d 仅列出目录本身, ...