一、MQ概述
精短简介
Java中有队列数据结构,但是是基于内存的,只有本JVM可以使用 MQ中间件是一个多客户端节点可以操作的队列结构
简单案例
异步消息处理(注册)
发送邮件、发送注册短信使用异步消息的模式,使得注册操作快速响应
应用解耦(订单_库存)
扣减库存接口可能会根据库存系统的升级而升级,而不得不导致订单系统也需要升级(重新部署) 使用消息队列后,库存系统订阅队列即可,无需关心库存系统接口升级的问题
流量控制
高并发场景下(秒杀),将请求存入mq,后台系统按照自己的处理能力来消费任务,达到削峰的目的
概述
消息代理(message broker)
消息代理:指安装了消息中间件的服务器,用于接收消息和发送消息
目的地(destination)
通俗解释:消息代理接收到消息后会将消息继续发给目的地(生产者发送消息) 目的地主要有两种形式:队列、主题
队列(queue)【单播_点对点消息通信】
点对点消息通信(point-to-point) 1.消息发送者发送消息,消息代理将其放入一个队列中,消息接受者从队列中获取消息内容,消息读取后被移出队列 2.队列可以被多个消费者监听,但一条消息只会被一个消费者成功消费
主题(topic)【广播_发布/订阅】
发布(publish)/订阅(subscribe)消息通信 1.发送者发送消息到主题,多个订阅者订阅该主题,多个消费者会同时收到消息
两种规范
JMS(JAVA消息服务)
JMS:(Java Message Service) JAVA消息服务,基于JVM信息代理的规范。ActiveMQ、HornetMQ是JMS实现
AMQP(高级消息队列协议)
AMQP:(Advanced Message Queuing Protocol) 高级消息队列协议,也是一个消息代理的规范,兼容JMS RabbitMQ是AMQP的实现
基于以上两种规范的分析
支持消息类型:byte[]=》只要能支持byte[]就可以传输,例如将对象转换为json,然后转二进制流传输即可 五种消息模型:重要,direct exchange其实就是队列 后四种就是主题的变种
Spring支持与SpringBoot自动装配
使用@EnableRabbit开启自动配置
二、RabbitMQ安装与测试
文档:https://www.rabbitmq.com/networking.html
docker安装
4369,25672(Erlang发现&集群端口) 5672,5671(AMQP端口) 15672(web管理后台端口) 61613,61614(STOMP协议端口) 1883,8883(MQTT协议端口) https://www.rabbitmq.com/networking.html 1.下载镜像并启动 docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management 2.修改为自动重启 docker update rabbitmq --restart=always 3.登录管理页面 http://192.168.56.10:15672/ guest guest
RabbitMQ运行机制
消息路由名词解释
1.新增了Exchange和Binding角色 2.消息路由:消息到达Exchange,并根据Binding关系发布到Queue队列中的过程,被称为消息路由
Exchange类型
direct
fanout
topic
1.Exchange名词解释:是AMQP高级消息队列协议的划分 2.RabbitMQ有四种Exchange类型: 2.1.点对点通信 2.1.1.direct 解析:直接交换机【单播模式,按照路由关系精确匹配】 例:路由键是dog,direct Exchange绑定了两个队列,队列1:dog、队列2:dogTom 使用direct Exchange只会把消息发送给队列1 2.1.2.headers【性能比较低,不会用到,与direct几乎一致】 2.2.发布/订阅: 2.2.1.fanout 解析:扇形【广播模式,不关心路由键】 例:消息会发送给fanout Exchange绑定的所有队列 2.2.2.topic 解析:主题【部分广播,区分路由键】 例:binding.key=usa.* :*处必须有一个单词 binding.key=#.news:#处有0个或多个单词 注:不能匹配字母,只能匹配单词 3.
direct案例:
fanout案例:
Topic案例:
测试案例
测试案例1
http://192.168.56.10:15672/#/exchanges 1.新建交换机 Exchanges=》Add a new Exchange=》Add Exchange 2.新建队列 Queues=》Add a new Queue=》Add Queue 3.在交换机表格中点击新建的交换机,绑定刚刚新建的队列 Bindings=》Add binding from this exchange=》To queue=》Bind 4.发送消息 =》publishe Message 5.获取消息 Nack message requeue true Automatic ack Reject requeue true Reject requeue false 6.解除binding =》unbind
1.新建交换机:
2.新建队列:
3.在交换机表格中点击新建的交换机:
4.发送消息
消息发送成功:
5.获取消息
Nack message requeue true
不回复消息,并且消息重新入队
Automatic ack
自动回复消息,消息不重新入队
Reject requeue true
Reject requeue false
6.解除binding
测试案例2
根据上表 1.建立交换机: exchange.direct【点对点】 exchange.fanout【广播,消息会发送给binding的多个队列中】 exchange.topic【广播,会先找到存在binding关系的队列,然后按照binding关系的路由规则与路由键进行模糊匹配】 2.建立队列: atguigu atguigu.news atguigu.emps gulixueyuan.news 3.创建binding关系 exchange.direct绑定所有队列【绑定规则是根据路由键与路由精确绑定决定消息进入哪个队列】 exchange.fanout绑定所有队列【消息会发送给每个队列】 exchange.topic绑定所有队列【并设置不同的路由键atguigu.#、*.news】 4.发送消息
快速入门RabbitMQ并且加入项目实战-kuai-su-ru-men-rabbitmq-bing-qie-jia-ru-xiang-mu-shi-zhan(二)https://developer.aliyun.com/article/1469516