MQ简介 在计算机科学中,消息队列(英文:Messagequeue)是进程之间或者同一进程的不同线程之间的一种通信方式。列用于处理通常来自用户的一系列输入。消息队列提供异步通信协议。存储栏中的每条记录都包含了详细的数据,包括发生的时间、输入设备的类型、具体的输入参数,也就是说:消息的发送者和接收者都不需要在消息队列中进行交互同时。消息保留在队列中,直到接收方检索它。实现消息队列通常存储在链表结构中。具有特权的进程可以向消息队列写入或读取消息。 目前有很多消息队列的开源实现,包括JBossMessaging、JORAM、ApacheActiveMQ、SunOpenMessageQueue、IBMMQ、ApacheQpid、HTTPSQS等。 目前使用的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,Redis、Mysql、phxsql等一些数据库也可以实现消息队列的功能。特点MQ是消费者-生产者模型的典型代表。一端不断向消息队列写入消息,另一端可以读取或订阅队列中的消息。MQ类似于JMS,不同的是JMS是SUNJAVA消息中间件服务的标准和API定义,而MQ是遵循AMQP协议的具体实现和产品。注:AMQP,即AdvancedMessageQueuingProtocol,是一种提供统一消息服务的应用层标准高级消息队列协议。它是应用层协议的开放标准,专为面向消息的中间件而设计。基于该协议的客户端和消息中间件可以传输消息,不受不同客户端/中间件产品、不同开发语言等条件的限制。JMS,JavaMessageService(Java消息服务)应用程序编程接口,是Java平台中面向消息的中间件API,用于在两个应用程序之间或在分布式系统中发送消息进行异步通信。JavaMessageService是一个与特定平台无关的API,大多数MOM提供者都提供对JMS的支持。大多数常见的消息队列都实现了JMSAPI,例如ActiveMQ、Redis和RabbitMQ。优缺点 应用耦合、异步处理、流量切割解耦 传统模式: 传统模式的缺点: 系统间耦合太强,如上图,系统A是在代码中直接在系统中调用B系统和C系统的代码。如果以后接入D系统,A系统需要修改代码,太麻烦了! 中间件模式 中间件模式的优点: 将消息写入消息队列,需要消息的系统自己从消息队列订阅,所以系统A不需要做任何修改。异步 传统模式: 传统模式的缺点: 一些非必要的业务逻辑同步运行,太耗时。 中间件模式: 中间件模式的优点: 将消息写入消息队列,需要消息的系统自己从消息队列订阅,所以系统A不需要做任何修改。削峰 传统模式: 传统模式的缺点: 并发量大时,所有请求直接发到数据库,导致数据库连接不正常 中间件模式: 中间件模式的优点: 系统A根据数据库能处理的并发量慢慢从消息队列中拉取消息。在生产中,这种短暂的峰值积压是允许的。缺点降低系统可用性,增加系统复杂度使用场景 消息队列是分布式系统中的重要组件。控制的时候,差不多就是需要用到消息队列的时候了。在项目中,将一些不需要立即返回且耗时的操作提取出来异步处理,这种异步处理方式大大节省了服务器的请求响应时间,从而提高了系统的吞吐量。为什么使用RabbitMQ AMQP,AdvancedMessageQueuingProtocol,高级消息队列协议,是一个应用层协议的开放标准,专为面向消息的中间件而设计。消息中间件主要用于组件之间的解耦,消息的发送方不需要知道消息使用者的存在,反之亦然。 AMQP的主要特点是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性和安全性。 RabbitMQ是一个开源的AMQP实现,服务端用Erlang语言编写,支持多种客户端,如:Python,Ruby,.NET,Java,JMS,C,PHP,ActionScript,XMPP,STOMP等.,支持AJAX。用于在分布式系统中存储和转发消息,在易用性、可扩展性和高可用性方面表现良好。总结如下:基于AMQP协议,高并发(容量的一个概念,服务器能接受的最大任务数)高性能(速度的一个概念,单位时间内服务器能处理的任务数)高可用(持久化的概念,服务器在单位时间内能正常工作的时间比例)强大的社区支持,很多公司都在使用支持插件来支持多国语言
