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协定
- 高并发(是一个容量的概念,服务器能够承受的最大工作数量)
- 高性能(是一个速度的概念,单位工夫内服务器能够解决的工作数)
- 高可用(是一个长久的概念,单位工夫内服务器能够失常工作的工夫比例)
- 弱小的社区反对,以及很多公司都在应用
- 反对插件
- 反对多语言