生活中的案例
- 学生问问题
- 分布式项目中通过
RPC
框架调用处理时间过长的问题
为什么要使用MQ
- 微服务架构后,链式调用是我们在写程序的时候都是基本的写法
- 为了这完成这一个整体功能会把它拆分成多个函数(或子模块)
- 比如模块 A 调用模块 B,模块 B 调用模块 C,模块 C 调用模块 D
- 但是大型分布式应用中,系统间的 RPC 交互复杂,一个功能后面要调用上百个接口并非不可能
- 从
单体
架构过渡到分布式
微服务
架构中,这样的架构中会出现什么问题呢 - 当然是有的, 根据上面的几个问题,在设计系统时,就可以明确的要达到以下的几个目标
- 能够解耦
- 能够削峰
- 能够异步
- 要做到系统
解耦
,当新的模块进来时,可以做到代码改动最小 - 设置流程的缓冲池,可以让后端系统按自身吞吐能力进行消费,不被冲垮
- 强弱的依赖梳理,能把非关键的调用链路的操作,
异步化
,并提升整体系统的吞吐能力
什么是MQ
- 面向
消息
的中间件(message-oriented middleware0) -
MOM
能够很好的解决以上的问题 - MQ 是指利用高效可靠的消息传递机制进行与平台无关的数据交流
- 并基于
数据通信
来进行分布式系统的集成 - 通过提供消息传递和消息排队模型在分布式环境下提供应用解耦,弹性伸缩,冗余存储,流量削峰,异步通信,数据同步等
大致流程
- 发送者把
消息
发送到消息服务器,消息服务器把消息存放在若干个队列或主题中,在合适的时候,消息服
务器会把消息转发给接受者,也就是消费者 - 在这个过程中,发送和接受是
异步
的,也就是发送无需等待,和发送者和接受者的生命周期也没有任何关系 - 在发布 pub / 订阅 sub模式下,也可以完成
一对多
的通信,可以让一个消息有多个接受者 - 微信订阅号就是这样的
MQ的特点
异步处理模式
- 消息发送者可以发送一个消息不需要等待响应
- 消息发送者把消息发送到一条虚拟的通道(主题或队列)上
- 消息接收者则订阅或监听该通道
- 一条信息可能最终转发给一个或多个消息接收者,这些接收者都无需对消息发送者做出回应
- 整个过程都是异步的
- 举个例子:
- 也就是说,一个系统和另一个系统之间进行通信的时候,假如系统 A 希望发送一个消息给系统B,让它去处理,但是系统 A 不关注系统 B 到底怎么处理或者有没有处理好,所以系统 A 把消息发送给
MQ
,然后就不管这条消息的死活
了,接着系统 B 从 MQ 里面消费这条消息处理即可- 至于怎么处理,是否处理完毕,什么时候处理,都是系统 B 的事,与系统 A 无关
- 这样的一种通信方式,就是所谓的
异步
通信方式,对于系统 A 来说,只要把消息发给 MQ- 然后系统 B 就会异步的去进行处理了,系统 A不能
同步
的等待系统 B 处理完- 这样的好处是什么呢,当然是
解耦
啦
应用系统的解耦
- 发送者和接收者不必了解对方,只需要
确认消息
- 发送者和接收者,可以不在同一时间在线
现实中的业务
Rabbit概述及注意点
- RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)
- RabbitMQ 服务器是用
Erlang
语言编写的,而集群和故障转移是构建在开放电信
平台框架上的- 所有主要的编程语言均有与代理接口通讯的客户端库
归纳一下
- RabbitMQ 实现了
AMQP
协议来构建自己的消息队列 - RabbitMQ 是
Erlang
语言写的,但是我们操作 RabbitMQ 的驱动是 Java 编写的
ActiveMQ和RabbitMQ的区别
- ActiveMQ 他实现的是
JMS
协议(Java 消息协议) - RabbitMQ 实现的是
AMQP
协议(高级消息队列协议) - ActiveMQ:是
Java
写的 - RabbitMQ:是
Erlang
写的,吞吐更多,延时更低! - 当然:区别还有很多,你一学就知道了我就不在多说了,后面有时间我会更新好的
RabbitMQ的特点
- RabbitMQ 最初起源于
金融系统
,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗 - 具体特点如下:
可靠性
- 可靠性(Reliability)
- RabbitMQ 使用一些机制来保证消息的可靠性,如持久化、传输确认、发布确认
灵活的路由
- 灵活的路由(Flexible Routing)
- 在消息进入队列之前,通过
Exchange
来路由消息的 - 对于典型的路由功能,RabbitMQ 已经提供了一些内置的
Exchange
来实现 - 针对更复杂的路由功能,可以将多个
Exchange
绑定在一起,也能通过插件机制实现自己的Exchange
消息集群
- 消息集群(Clustering)
- 多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑
Broker
高可用
- 高可用(Highly Available Queues)
- 队列可以在集群中的任意一台机器上进行存储,使得在部分节点出问题的情况下队列仍然可用
多种协议
- 多种协议(Multi-protocol)
- RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等
多语言客户端
- 多语言客户端(Many Clients)
- RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等
管理界面
- 管理界面(Management UI)
- RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面
跟踪机制
- 跟踪机制(Tracing)
- 如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么
插件机制
- 插件机制(Plugin System)
- RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件