什么是MQ
MQ全称为Message Queue(信息队列),消息队列是应用程序和应用程序之间的通信方法。
多用于分布式系统之间进行通信
分布式系统中两种通信方式
1.直接远程通信
2.借助第三方 完成间接通信.
MQ指的中间件
生产者(发送方)—中间件----消费者(接收方)
MQ的优势
- 应用解耦 远程调用耦合性越高,容错性就越低,可维护性差.使用MQ使得应用间解耦,提示容错性和可维护性.
- 异步提速 提升用户体验和系统吞吐量(单位时间内处理请求的数目)
- 削峰填谷高峰期消息积压,在高峰期过后的一段时间内,使用MQ后消息会一直维持在服务器能承受的范围内 ,知道消费完积压的消息,提升系统的稳定性.
MQ的劣势
- 系统可用性降低 系统引入的外部依赖越多,系统的稳定性就越差.一旦MQ宕机,就会对业务造成影响,如何保证MQ的高可用?
- 系统复杂度提高 大大增加了系统的复杂度,以前是系统间的同步消息调用,现在通过MQ变成异步,如何保证消息没有被重复消费,消息丢失,以及信息传递的顺序性?
- 一致性问题 A系统处理完业务,通过MQ给B,C两个系统发消息数据,如果B系统成功,C系统失败,如何保证数据处理的一致性?
使用MQ需满足的条件
1.生产者不需要从消费者处获得反馈,引入消息队列前直接引用,接口返回值应该为空.
2.容许短暂的不一致性
3.利大于弊 及解耦,提速,削峰这些方面的收益,大于加入MQ,管理MQ这些成本
RabbitMQ 简介
2007年,Rabbit 技术公司基于 AMQP 标准开发的 RabbitMQ 1.0 发布。RabbitMQ 采用 Erlang 语言开发。Erlang 语言由 Ericson 设计,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。
AMQP 和 JMS
MQ是消息通信的模型;实现MQ的大致有两种主流方式:
1.AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。
2.JMS:JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信
简单总结
RabbitMQ是基于AMQP协议使用Erlang语言开发的一款信息队列产品
AMQP是协议 类比http
JMS是API规范接口,类比JDBC