MQ 简介
在计算机科学中,音讯队列(英语:Message queue)是一种过程间通信或同一过程的不同线程间的通信形式,软件的贮列用来解决一系列的输出,通常是来自用户。音讯队列提供了异步的通信协议,每一个贮列中的纪录蕴含具体阐明的数据,蕴含产生的工夫,输出设施的品种,以及特定的输出参数,也就是说:音讯的发送者和接收者不须要同时与音讯队列互交。音讯会保留在队列中,直到接收者取回它。
实现
音讯队列经常保留在链表构造中。领有权限的过程能够向音讯队列中写入或读取音讯。
目前,有很多音讯队列有很多开源的实现,包含 JBoss Messaging
、JORAM
、Apache ActiveMQ
、Sun Open Message Queue
、IBM MQ
、Apache Qpid
和HTTPSQS
。
以后应用较多的音讯队列有 RabbitMQ
、RocketMQ
、ActiveMQ
、Kafka
、ZeroMQ
、MetaMq
等,而局部数据库如 Redis
、Mysql
以及 phxsql
也可实现音讯队列的性能。
特点
MQ 是消费者 - 生产者模型的一个典型的代表,一端往音讯队列中一直写入音讯,而另一端则能够读取或者订阅队列中的音讯。MQ 和 JMS 相似,但不同的是 JMS 是 SUN JAVA 消息中间件服务的一个规范和 API 定义,而 MQ 则是遵循了 AMQP 协定的具体实现和产品。
留神:
AMQP
,即 Advanced Message Queuing Protocol, 一个提供对立音讯服务的应用层规范高级音讯队列协定, 是应用层协定的一个凋谢规范, 为面向音讯的中间件设计。基于此协定的客户端与消息中间件可传递音讯,并不受客户端 / 中间件不同产品,不同的开发语言等条件的限度。JMS
,Java 音讯服务(Java Message Service)利用程序接口,是一个 Java 平台中对于面向消息中间件的 API,用于在两个应用程序之间,或分布式系统中发送音讯,进行异步通信。Java 音讯服务是一个与具体平台无关的 API,绝大多数 MOM 提供商都对 JMS 提供反对。常见的音讯队列,大部分都实现了 JMS API,如ActiveMQ
,Redis
以及RabbitMQ
等。
优缺点
长处
利用耦合、异步解决、流量削锋
-
解耦
传统模式:
传统模式的毛病:
零碎间耦合性太强,如上图所示,零碎 A 在代码中间接调用零碎 B 和零碎 C 的代码,如果未来 D 零碎接入,零碎 A 还须要批改代码,过于麻烦!
中间件模式
中间件模式的的长处:
将音讯写入音讯队列,须要音讯的零碎本人从音讯队列中订阅,从而零碎 A 不须要做任何批改。
- 异步
传统模式:
传统模式的毛病:
一些非必要的业务逻辑以同步的形式运行,太消耗工夫。
中间件模式:
中间件模式的的长处:
将音讯写入音讯队列,须要音讯的零碎本人从音讯队列中订阅,从而零碎 A 不须要做任何批改。
- 削峰
传统模式:
传统模式的毛病:
并发量大的时候,所有的申请间接怼到数据库,造成数据库连贯异样
中间件模式:
中间件模式的的长处:
零碎 A 缓缓的依照数据库能解决的并发量,从音讯队列中缓缓拉取音讯。在生产中,这个短暂的高峰期积压是容许的。
毛病
零碎可用性升高、零碎复杂性减少
应用场景
音讯队列,是分布式系统中重要的组件,其通用的应用场景能够简略地形容为:当不须要立刻取得后果,然而并发量又须要进行管制的时候,差不多就是须要应用音讯队列的时候
在我的项目中,将一些无需即时返回且耗时的操作提取进去,进行了异步解决,而这种异步解决的形式大大的节俭了服务器的申请响应工夫,从而进步了零碎的吞吐量。
为什么应用 RabbitMQ
AMQP,即 Advanced Message Queuing Protocol,高级音讯队列协定,是应用层协定的一个凋谢规范,为面向音讯的中间件设计。消息中间件次要用于组件之间的解耦,音讯的发送者无需晓得音讯使用者的存在,反之亦然。
AMQP 的次要特色是面向音讯、队列、路由(包含点对点和公布 / 订阅)、可靠性、平安。
RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,反对多种客户端,如:Python
、Ruby
、.NET
、Java
、JMS
、C
、PHP
、ActionScript
、XMPP
、STOMP
等,反对 AJAX。用于在分布式系统中存储转发音讯,在易用性、扩展性、高可用性等方面体现不俗。
总结如下:
- 基于 AMQP 协定
- 高并发(是一个容量的概念,服务器能够承受的最大工作数量)
- 高性能(是一个速度的概念,单位工夫内服务器能够解决的工作数)
- 高可用(是一个长久的概念,单位工夫内服务器能够失常工作的工夫比例)
- 弱小的社区反对,以及很多公司都在应用
- 反对插件
- 反对多语言