RabbitMQ知识梳理
基本概念
生产者和消费者、队列、交换机、路由键、绑定
交换机类型:
- fanout 广播模式,效率高,不处理路由键
- direct 路由模式,处理路由键,1vs1
- topic 主题模式,匹配路由键,1vs多
- headers模式,效率差,不用
RabbitMQ 运转流程:
生产者发送消息过程:
- 连接到 RabbitMQ Broker 建立一个连接( Connection) ,开启信道 (Channel)
- 声明交换器 ,设置相关属性
- 声明队列,设置相关属性
- 通过路由键将交换器和队列绑定起来
- 发送消息至 RabbitMQ Broker ,其中包含路由键、交换器等信息
- 相应的交换器根据接收到的路由键查找相匹配的队列
- 如果找到 ,则将从生产者发送过来的消息存入相应的队列中
- 如果没有找到 ,则根据生产者配置的属性选择丢弃还是回退给生产者
- 关闭信道和连接
消费者接收消息的过程:
- 连接到 RabbitMQ Broker ,建立一个连接(Connection ,开启 个信道(Channel)
- 向 RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,以及做些准备工作
- 等待 RabbitMQ Broker 回应并投递相应队列中的消息, 消费者接收消息
- 消费者确认(ack)接收到的消息
- RabbitMQ 从队列中删除相应己经被确认的消息
- 关闭信道和连接
AMQP协议
即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议
入门使用
安装环境:
- windows安装(最简单,适合初学者)
- linux安装(标准和推荐方式,生产使用)
- docker安装(最最简单,前提是会docker)
交换机和队列:
- exchangeDeclare 声明交换机
- queueDeclare 声明队列
- queueBind 队列绑定
- exchangeBind 交换机绑定
- basicPublish 发送消息
- basicConsume 消费消息
- basicAck 消息确认
- basicReject 拒绝1条
- basicNack 拒绝多条
进阶使用
消息去从
- 正常消费,从队列中移除
- 被拒绝(Reject或Nack),进入死信队列
- 未被确认confirm,重回队列(mandatory、basicRecover)
- 消息超时TTL(Time to Live 的简称,即过期时间),进入死信队列
消息确认投递
- 生产者通过事务确认,性能低
- 消费者通过confirm确认,推荐
消息防止丢失
- 备份交换机,Altemate Exchange ,简称AE
Map<String, Object> args = new HashMap<String , Object>();
args.put("a1ternate-exchange" , "myAe");
channe1.exchangeDec1are( "norma1Exchange" , "direct" , true , fa1se , args);
channe1 . exchangeDec1are( "myAe " , "fanout" , true , fa1se , nu11) ;
channe1 .queueDec1are( "norma1Queue " , true , fa1se , fa1se , nu11);
channe1 .queueB nd( norma1Queue "norma1Exchange" , " norma1Key");
channe1 .queueDec1are( "unroutedQueue " , true , fa1se , fa1se , nu11);
channel .queueBind( "unroutedQueue " , "myAe " , "");
- 死信队列
- 镜像队列
- 持久化 druable
过期时间 (TTL)
- 队列设置, 队列中所有消息都有相同的过期时间
Map<String, Object> argss = new HashMap<String , Object>();
argss.put("x-message-ttl " , 6000);
channel . queueDeclare(queueName , durable , exclusive , autoDelete , argss) ;
- 消息设置,对消息本身进行单独设置,每条消息的 TTL 可以不同
AMQP.BasicProperties properties = new AMQP.BasicProperties() ;
properties.setExpiration("60000");
channel . basicPublish (exchangeName, routingKey, mandatory, propertes, "ttlTestMessage".getBytes());
消息分发
- 轮询分发(round-robin ),默认
- 均衡分发,channel.basicQos(1)
高级队列
1.死信队列
DLX ,全称为 Dead-Letter-Exchange ,可以称之为死信交换器,也有人称之为死信邮箱。当
消息在一个队列中变成死信 (dea message) 之后,它能被重新被发送到另一个交换器中,这个
交换器就是 DLX ,绑定 DLX 的队列就称之为死信队列。
消息变成死信 般是由于以下几种情况:
1、消息被拒绝 (Basic.Reject/Basic .Na ck) ,井且设置 requeue 参数为 alse;
2、消息过期;
3、令队列达到最大长度。
channel . exchangeDeclare("dlx_exchange " , "dir ect "); // 创建 DLX: dlx_exchange
Map<String, Object> args = new HashMap<String, Object>();
args . put("x-dead-letter-exchange" , " dlx exchange ");
//为队列 myqueue 添加 DLX
channel . queueDeclare("myqueue" , false , false , false , args);
也可以为这个 DLX 指定路由键,如果没有特殊指定,则使用原队列的路由键:
args.put("x-dead-letter-routing-key" , "dlx-routing-key");
2.延迟队列
通过DLX死信队列和TTL时间过期模拟出延迟队列的功能。
3.优先队列
优先级高的消息具备优先被消费的特权,默认最低为0。如果消费速度大于生产速度,则没有意义
Map<String, Object> args =new HashMap<String, Object>() ;
args . put( "x-rnax-priority" , 10) ;
channel.queueDeclare( " queue . priority" , true , fa1se , false , args) ;
4.镜像队列
参考书籍:
《RabbitMQ 实战指南》朱忠华 著

RabbitMQ知识梳理的更多相关文章
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
- solr DIH 知识梳理
solr DIH 知识梳理 web.xml中listener配置 <listener> <listener-class>org.apache.solr.handler.data ...
- Anliven - 基础知识梳理汇总 - 软件测试
基础知识梳理 - 软件测试 - 概念 基础知识梳理 - 软件测试 - 分类 基础知识梳理 - 软件测试 - 流程 基础知识梳理 - 软件测试 - 用例 基础知识梳理 - 软件测试 - 方法 基础知识梳 ...
- [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- java基础知识梳理
java基础知识梳理 1 基本数据类型
随机推荐
- NIOBuffer 缓冲区
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但是,Channel,Buffer 和 Select ...
- Spring Cloud Ribbon源码分析---负载均衡实现
上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用.这一篇我们来分析Ribbon实现负载均衡的过程. 从 @LoadBalanced入手 还 ...
- git推送本地分支到远程仓库并在远程仓库创建新分支
$ git push <远程主机名> <本地分支名>:<远程分支名> git push master test:test #master 为设置的远程仓库别名,第一 ...
- 微信小程序图片宽度100%,高度自适应
实现图片自适应,按照一般情况只需设置: img { width: 100%; height: auto; } 但是微信小程序里是特例,需要image标签上设置属性mode=widthFix,就是hei ...
- 【深入学习linux】Xshell的安装和使用
桥接模式下,连接xshell教程 centOS7 的ifcfg-ens33 跟刚才记录的一样 第一步:进入终端 /etc/sysconfig/network-scripts/目录 第二步:修改i ...
- 通过mitmproxy爬取APP的数据
安装: https://mitmproxy.org/ 小米安装证书 设置->系统安全->从存储设备安装->选择*.pem文件 模拟器安装证书 (请从C:\Users\John\.mi ...
- 个人收集的Android开源项目
1. KnowWeather 下载:GitHub 一款 Android 开源天气 App ,包含天气信息.详情.生活指数等,通知栏,桌面小部件,定时更新天气等等,应用没有任何广告,支持县级.区级城市的 ...
- JS 从整数里 随机选一个
比如:现有数字随机一个 num = 3)) // 现有数随机一个 randomNum 的值只会是 0 1 2 3 里的随机一个 如果想要从数组随机一个下标index 就不要+1 如: parseInt ...
- 006-tomcat 多实例安装、appBase和docBase、Context说明
一.多实例部署 主要是为了充分利用服务器资源,并且可以交叉部署应用.主要做法可以有使用docker部署,多实例部署. 多实例多应用:多个 Tomcat 部署多个不同的项目.这种模式在服务器资源有限,或 ...
- kubernetes 1.9 安装部署
参考地址:https://github.com/gjmzj/kubeasz 引言 提供快速部署高可用k8s集群的工具,基于二进制方式部署和利用ansible-playbook实现自动化,既提供一键安装 ...