RabbitMQ 入门学习
MQ 消息队列
MQ全称为Message Queue即消息队列
什么是消息队列?
"消息队列"
是在消息的传输过程中保存消息的容器。- 它是典型的:生产者————消费者模型 1.生产者不断向消息队列中生产消息 2.消费者不断的从队列中获取消息。 3.因为消息的生产和消费都是异步的,而且只关心消息的发送和接收。 4.没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。
消息队列 常用场景:⭐
以下信息来源于:大佬,感谢大佬!!分享
服务解耦
场景
- 服务A产生数据, 而服务B,C,D需要这些数据 那么我们可以在A服务中直接调用B,C,D服务,把数据传递到下游服务即可
- 但 随着我们的应用规模不断扩大,会有更多的服务需要A的数据, 如果有几十甚至几百个下游服务,而且会不断变更,再加上还要考虑下游服务出错的情况, 那么,A服务中调用代码的维护会极为困难
MQ解耦
- A服务只需要向消息服务器发送消息,而不用考虑谁需要这些数据;
- 下游服务如果需要数据,自行从消息服务器订阅消息,不再需要数据时则取消订阅即可
流量削峰
场景:
- 假设我们有一个应用,平时访问量是每秒300请求,我们用一台服务器即可轻松应对
- 在高峰期, 访问量瞬间翻了十倍, 达到每秒3000次请求, 单台服务器无法应对, 这时我们增加到10台服务器,减压
- 但如果这种瞬时高峰的情况每天只出现一次,每次只有半小时 那么我们10台服务器在多数时间都只分担每秒几十次请求,这样就有点浪费资源了
MQ
- 使用RabbitMQ来进行流量削峰 高峰情况下, 瞬间出现的大量请求数据, 先发送到消息队列服务器, 排队等待被处理
- 我们的应用,可以慢慢的从消息队列接收请求数据进行处理 这样把数据处理时间拉长,以减轻瞬时压力
异步调用
场景:
- 外卖支付 支付后要发送支付成功的通知 再寻找外卖小哥来进行配送,而寻找外卖小哥的过程非常耗时
- 尤其是高峰期,可能要等待几十秒甚至更长,这样就造成整条调用链路响应非常缓慢
MQ
- 订单数据可以发送到消息队列服务器 那么调用链路也就可以到此结束, 订单系统则可以立即得到响应, 整条链路的响应时间只有200毫秒左右;
- 寻找外卖小哥的应用可以,
异步的方式从消息队列接收订单消息,再执行耗时的寻找操作
常见MQ产品
- ActiveMQ:基于JMS
- Kafka:分布式消息系统,高吞吐量
- RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
- RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会
AMQP 和 JMS ⭐
- AMQP
高级消息队列协议!
是应用层协议的一个开放标准,为面向消息的中间件设计,兼容 JMSRabbitMQ 就是基于 AMQP 协议实现的。
- JMS
java 消息服务
JMS的客户端之间可以通过JMS服务
进行异步的消息传输。 JMS(JAVA Message Service,Java消息服务)API是一个消息服务的标准或者说是规范 允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。 它使分布式通信耦合度更低,消息服务更加可靠以及异步性。 ActiveMQ 就是基于 JMS 规范实现的。
总结:
- AMQP 为消息定义了线路层(wire-level protocol)的协议 JMS所定义的是API规范。
- 跨平台:
Java 体系中,多个client均可以通过JMS进行交互,不需要应用修改代码,但是其对跨平台的支持较差。
而AMQP天然具
有跨平台、跨语言特性。
- 支持消息类型: JMS 支持TextMessage、MapMessage 等复杂的消息类型; 而 AMQP 仅支持 byte[] 消息类型(复杂的类型可序列化后发送)
- Exchange
交换机
提供的路由算法 AMQP可以提供多样化的路由方式来传递消息到消息队列 4种交换机类型,6种模式 JMS 仅支持 队列 和 主题/订阅 方式两种
RabbitMQ 简介:
- MQ全称为Message Queue即
消息队列
- RabbitMQ是由
erlang
语言开发,所以安装环境需要安装erlang
- 基于
AMQP
(Advanced Message Queue 高级消息队列协议
)协议实现的消息队列 - 它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛
RabbitMQ 的工作原理
组成部分:⭐
- Broker
消息队列服务进程
:此进程包括两个部分:Exchange交换机
和Queue队列
- Exchange
交换机
:按一定的规则将消息路由转发到某个队列,对消息进行过虑。 一个有四种类型:Direct, Fanout, Topic, Headers - Queue
消息队列
:存储消息的队列。 - Producer 消息生产者,即生产方客户端,生产方客户端将消息发送到MQ
- Consumer 消息消费者,即消费方客户端,接收MQ转发的消息。
-----发送消息-----
- 生产者和Broker建立TCP连接。
- 生产者和Broker建立通道。
- 生产者通过通道消息发送给Broker,由Exchange将消息进行转发~
队列中去!
----接收消息-----
- 消费者和Broker建立TCP连接
- 消费者和Broker建立通道
- 消费者监听指定的Queue(队列),当有消息到达Queue时Broker默认将消息推送给消费者。
Exchange交换机四种类型 ⭐
RabbitMQ消息传递模型的核心思想是:
生产者永远不会将任何消息直接发送到队列,通常生产者甚至不知道消息是否会被传递到任何队列。生产者只能向交换机(Exchange)发送消息。
交换机是一个非常简单的东西。一边接收来自生产者的消息,另一边将消息推送到队列。
- direct : 需要生产者和消费者绑定相同的Exchange和routing key
- fanout: 广播模式需要生产者消费者绑定相同的Exchange
- topic: 支持模糊匹配的广播模式以点分隔** * 表示一个单词 # 表示任意数量(零个或多个)单词。
- header: 根据生产者和消费者的header中信息进行匹配,性能较差 ,x-match [all 匹配所有/any 任意一个]
RabbitMQ环境搭建 ✔
Erlang 环境配置:
- RabbitMQ由Erlang语言开发
所以需要安装对应的,运行环境!
下载erlang
- 找到 otp_win64_20.3.exe,以管理员方式运行此文件,安装
无脑下一步即可!
- 配置erlang环境变量
环境变量:
ERLANG_HOME=erlang安装目录
注意别在中文目录下! path中添加:%ERLANG_HOME%bin
- 测试
RabbitMQ 安装:
- RabbitMQ下载
- rabbitmq-server-3.7.3.exe:以管理员方式运行此文件安装
下一步...
- 之后就可以在 windows 系统菜单看到:
- install 安装服务
之后
start 启动服务即可… - 服务:安装/启动,ok 之后: 安装rabbitMQ的管理插件,
就可以通过浏览页面,方便的管理Rabbit了
安装目录下:管理员身份运行 rabbitmq-plugins.bat enable rabbitmq_management
- 进入浏览器,输入:
http://localhost:15672
用户/密码 默认: guest
- 主要端口介绍 4369 – erlang发现口 5672 – client端通信口 15672 – 管理界面ui端口 25672 – server间内部通信口
如果开始菜单中没有,服务则进入安装目录下sbin目录手动启动:
- 安装并运行服务:
rabbitmq-service.bat install 安装服务
bbitmq-service.bat start 启动服务
- 安装管理插件
如上
RabbitMQ 服务启动不…
- 这个我也遇到过,刚启动,就马上停止了! 后来以查
Windows账号名是中文的!!!
- 防不胜防!!中问到哪里都难受!!