文章目录
第1章 RabbitMQ 概述
消息:应用间传递的数据
消息队列:应用间的通信方式,有消息系统老确保消息的可靠传递,发布者和使用者都不知道对方的存在
为什么要使用? 异步操作、降低耦合
其他场景包括最终一致性(允许完成主要部分)、广播、错峰流控等等
强一致性(全都完成或都不完成)
事务特性:
- 原子性 (atomicity):强调事务的不可分割.
- 一致性 (consistency):事务的执行的前后数据的完整性保持一致.
- 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
- 持久性(durability) :事务一旦结束,数据就持久到数据库
RabbitMQ特点:
一个有Erlang语言开发的AMQP(高级消息队列协议)的开源实现
- 可靠性
- 灵活的路由(转发)
- 消息集群(高可用、防单点故障)
- 高可用
- 多协议
- 多语言客户端
- 管理界面
- 跟踪机制(消息异常。。。)
另一款 卡夫卡
第2章 RabbitMQ安装
ErLang
#启动RabbitMQ
rabbitmq-server start &
#停止服务
rabbitmqctl stop
第3章 RabbitMQ 消息发送和接收
通用模型:
AMQP模型:
Exchange 交换机类型
- direct 一对一精准匹配
- fanout 类似广播模式,缺点会丢失消息,优点速度快
- topic 模式匹配分配消息
- headers(与direct一致,但性能差很多,几乎不用)
3.1 Java 发送和接收 Queue的消息 (不依赖交换机)
3.2 Java 绑定 Exchange 发送和接收 Queue的消息
- direct
- fanout
- topic
/**
* Topic 类型的交换机也是消息一对多的一种交换机类型,它和fanout都能实现一个消息同时发送给多个队列
* fanout更适合于使用在一个功能不同的进程来获取数据,例如手机App中的消息推送,一个App可能会还有很
* 多个用户来进行安装然后他们都会启动一个随机的队列来接收着自己的数据
* Topic更适合不同的功能模块来接收同一个消息,例如商城下单成功以后需要发送消息到队列中。例如RoutingKey
* 为 的order.success,物流系统监听订单order.* 发票系统监听order.*
*
* Topic可以使用随机的队列名也可以使用一个明确的队列名,但是如果应用在和订单有关的功能中,建议是有个
* 名取的队列名并且要求为持久化的队列
*/
事务
RabbitMQ有两种方式解决事务问题
- AMQP的事务机制
channel.txSelect()声明启动事务模式;
channel.txCommint()提交事务;
channel.txRollback()回滚事务;
- 发送者确认模式
channel.waitForConfirms()普通发送方确认模式;
channel.waitForConfirmSOrDie() 批量确认模式; 大部分选择批量模式
channel.addConfirmListener() 异步监听发送方确认模式
- 消费者确认模式
basicAck(): 用于肯定确认,multiple参数用于多个消息确认。
basicRecover():是路由不成功的消息可以使用recovery重新发送到队列中。
basicReject():是接收端告诉服务器这个消息我拒绝接收,不处理,可以设置是否放回到队列中还是丢掉,而且只能一次拒绝一个消息,官网中有明确说明不能批量拒绝消息,为解决批量拒绝消息才有了basicNack。
basicNack():可以一次拒绝N条消息,客户端可以设置basicNack方法的multiple参数为true。
第4章 SpringBoot 集成 RabbitMQ
添加RabbitMQ依赖,配置连接信息
声明交换机、队列的两种方式
- 注解
- 配置文件
第5章 RabbitMQ 集群
集群方式
- 普通模式(默认) :建立临时通道从A读取消息到B中
- 镜像模式(高可用模式):A数据镜像到B中
Erlang Cookie是保证不同节点可以互相通信的秘钥,要保证集群中的不同节点互相通信必须共享相同的Erlang Cookie,具体存放在/var/lib/rabbitmq/.erlang.cookie
可以使用scp命令完成文件跨机器拷贝
传送门
上一章:分布式 第七章 FastDFS
下一章: