rabbitMq
1 MQ引言
1.1 什么是MQ
1 | MQ(Message Quene) : 翻译为消息队列,通过典型的生产者 |
1.2 MQ有哪些
1 | 当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、 |
1.3 不同MQ特点
1 | 1.ActiveMQ |
2 RabbitMQ 的引言
2.1 RabbitMQ
1 | 基于AMQP协议,erlang语言开发,是部署最广泛的开源 |
1 | AMQP 协议 |
2.2 RabbitMQ 的安装
1 | 最新版的3.8版本的可以看我这篇文章 |
2.2.1 下载
2.2.2 下载的安装包
1 | 注意:这里的安装包是centos7安装的包 |
2.2.3 安装步骤
1 | # 1.将rabbitmq安装包上传到linux系统中 |
1 | 将上图中配置文件中红色部分去掉`%%`,以及最后的`,`逗号 |
1 | # 7.执行如下命令,启动rabbitmq中的插件管理 |
1 | # 10.关闭防火墙服务 |
1 | # 12.登录管理界面 |
3 RabiitMQ 配置
3.1 RabbitMQ 管理命令行
1 | # 1.服务启动相关 |
3.2 web管理界面介绍
3.2.1 overview概览
1 | connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才 |
3.2.2 Admin用户和虚拟主机管理
3.2.2.1 添加用户
1 | 上面的Tags选项,其实是指定用户的角色,可选的有以下几个: |
3.2.2.2 创建虚拟主机
1 | 虚拟主机 |
3.2.2.3 绑定虚拟主机和用户
1 | 创建好虚拟主机,我们还要给用户添加访问权限: |
1 | 进入虚拟机设置界面 |
4 RabbitMQ 的第一个程序
4.1 AMQP协议的回顾
4.2 RabbitMQ支持的消息模型
4.3 引入依赖
1 | <dependency> |
4.4 第一种模型(直连)
1 | 在上图的模型中,有以下概念: |
4.4.1 开发生产者
1 | package helloword; |
4.4.2 开发消费者
1 | package helloword; |
4.4.3 参数的说明
1 | channel.queueDeclare("hello",true,false,false,null); |
4.4.4 工具类的包装
1 | package utils; |
4.5 第二种模型(work quene)
1 | Work queues,也被称为(Task queues),任务模型。 |
1 | 角色: |
4.5.1 开发生产者
1 | channel.queueDeclare("hello", true, false, false, null); |
4.5.2 开发消费者-1
1 | channel.queueDeclare("hello",true,false,false,null); |
4.5.3 开发消费者-2
1 | channel.queueDeclare("hello",true,false,false,null); |
4.5.4 测试结果
1 | 总结:默认情况下,RabbitMQ将按顺序将每个消息发送给 |
4.5.5 消息自动确认机制
1 | Doing a task can take a few seconds. You may |
4.5.5.1 开发生产者
1 | package workquene; |
4.5.5.2 开发消费者-1
1 | 消费之1 |
4.5.5.3 开发消费者-2
1 | package workquene; |
4.5 第三种模型(fanout)
1 | fanout 扇出 也称为广播 |
1 | 在广播模式下,消息发送流程是这样的: |
4.5.1 开发生产者
1 | package fanout; |
4.5.2 开发消费者-1
1 | package fanout; |
4.5.3 开发消费者-2
1 | package fanout; |
4.5.4 开发消费者-3
1 | package fanout; |
4.5.5 测试结果
4.6 第四种模型(Routing)
4.6.1 Routing 之订阅模型-Direct(直连)
1 | 在Fanout模式中,一条消息,会被所有订阅的队列都消费。 |
1 | P:生产者,向Exchange发送消息,发送消息时, |
4.6.1.1 开发生产者
1 | package direct; |
4.6.1.2 开发消费者-1
1 | package direct; |
4.6.1.3 开发消费者-2
1 | package direct; |
4.6.1.4 测试生产者发送Route key为error的消息时
4.6.1.5 测试生产者发送Route key为info的消息时
4.6.2 Routing 之订阅模型-Topic
1 | Topic类型的Exchange与Direct相比,都是可以根据RoutingKey |
1 | # 统配符 |
4.6.2.1 开发生产者
1 | package topic; |
4.6.2.2 开发消费者-1
1 | Routing Key中使用*通配符方式 |
4.6.2.3 开发消费者-2
1 | Routing Key中使用#通配符方式 |
4.6.2.4 测试结果
5 SpringBoot中使用RabbitMQ
5.1 搭建初始环境
5.1.1 引入依赖
1 | <dependency> |
5.1.2 配置配置文件
1 | spring: |
5.2 第一种hello world模型使用
1 | 开发生产者 |
5.3 第二种work模型使用
1 | 开发生产者 |
1 | 说明:默认在Spring AMQP实现中Work这种方式就是公平调度,如果需要实现能者多劳需要外配置 |
5.4 Fanout 广播模型
1 | 开发生产者 |
5.5 Route 路由模型
1 | 开发生产者 |
5.6 Topic 订阅模型(动态路由模型)
1 | 开发生产者 |
6 MQ的应用场景
6.1 异步处理
1 | 场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种 |
1 | 并行方式: 将注册信息写入数据库后,发送邮件的同时,发送短信, |
1 | 消息队列:假设三个业务节点分别使用50ms,串行方式使用时间150ms, |
1 | 由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的 |
6.2 应用解耦
1 | 场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统 |
1 | 这种做法有一个缺点: |
1 | 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列, |
6.3 流量削峰
1 | 场景: 秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个 |
1 | 1.用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度 |
7 RabbitMQ的集群
1 | 最新版的3.8版本的可以看我这篇文章 |
7.1 集群架构
7.1.1 普通集群(副本集群)
1 | All data/state required for the operation of a |
1 | 核心解决问题: 当集群中某一时刻master节点宕机, |
1 | # 9.测试集群在node1上,创建队列 |
1 | # 10.查看node2和node3节点: |
1 | # 11.关闭node1节点,执行如下命令,查看node2和node3: |
7.1.2 镜像集群
1 | This guide covers mirroring (queue contents replication) |
1 | 配置集群架构 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 茶白的博客!
评论

































































