为什么要使用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 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件