1. MQ概述
1.1 MQ简介
MQ,Message Queue,是一种提供消息队列服务的中间件,也称为消息中间件,是一套提供了消息生产、存储、消费全过程的API的软件系统;消息即数据。一般消息的体量不大。
1.2 MQ用途
- 限流削峰 :MQ可以将系统的超量请求暂存其中,以便系统后期可以慢慢进行处理,从而避免了请求的丢失或系统被压垮;
- 异步解耦:上游系统对下游系统的调用若为同步调用,则会大大降低系统的吞吐量与并发度,且系统耦合度太高。而异步调用会解决这些问题。 所以在两层之间若要实现由同步到异步的转化,一般做法就是在这两层之间添加一个MQ层;
- 数据收集:分布式系统会产生海量数据流,如:业务日志,监控数据,用户行为等,针对这些数据流进行实时或批量采集汇总,然后对这些数据流进行大数据分析,这是当前互联网平台的必备技术;通过MQ完成此类数据收集是最好的选择;
1.3 常见的MQ产品
- ActiveMQ:使用Java开发的一款MQ产品。早期很多公司与项目使用,但现在社区活跃度已经很低,现在项目中很少使用;
- RabbitMQ:使用ErLang语言开发的一款MQ产品,其吞吐量较Kafka与RocketMQ要低,而且由于其不是Java语言开发,所以公司内部对其实现定制化开发难度较大;
- Kafka:使用Scala/Java语言开发的一款MQ产品,最大特点是高吞吐量,常用于大数据领域的实时计算,日志采集等场景,其没有遵循任何常见的MQ协议,而是使用自研协议;
- RocketMQ:使用Java语言开发的一款MQ产品,经过阿里数年双十一的考验,性能与稳定性很高,没有遵循任何常见的MQ协议,而是使用自研协议;
- 目前许多厂商采用并实现了JMS API,现在,JMS产品能够为企业提供一套完整的消息传递功能,下面是一些比较流行的JMS商业软件和开源产品。
(1)IBM MQSeries
IBM MQ系列产品提供的服务使得应用程序可以使用消息队列进行相互交流,通过一系列基于Java的API,提供了MQSeries在Java中应用开发的方 法。它支持点到点和发布/订阅两种消息模式,在基本消息服务的基础上增加了结构化消息类,通过工作单元提供数据整合等内容。
(2)WebLogic
WebLogic是BEA公司实现的基于工业标准的J2EE应用服务器,支持大多数企业级JavaAPI,它完全兼容JMS规范,支持点到点和发布/订阅消息模式,它具有以下一些特点:
- 通过使用管理控制台设置JMS配置信息;
- 支持消息的多点广播;
- 支持持久消息存储的文件和数据库;
- 支持XML消息,动态创建持久队列和主题。
(3)SonicMQ
SonicMQ是Progress公司实现的JMS产品。除了提供基本的消息驱动服务之外,SonicMQ也提供了很多额外的企业级应用开发工具包,它具有以下一些基本特征: - 提供JMS规范的完全实现,支持点到点消息模式和发布/订阅消息模式;
- 支持层次安全管理;
- 确保消息在Internet上的持久发送;
- 动态路由构架(DRA)使企业能够通过单个消息服务器动态的交换消息;
- 支持消息服务器的集群。
(4)Active MQ
Active MQ是一个基于Apcache 2.0 licenced发布,开放源码的JMS产品。其特点为: - 提供点到点消息模式和发布/订阅消息模式;
- 支持JBoss、Geronimo等开源应用服务器,支持Spring框架的消息驱动;
- 新增了一个P2P传输层,可以用于创建可靠的P2P JMS网络连接;
- 拥有消息持久化、事务、集群支持等JMS基础设施服务。
(5)OpenJMS
OpenJMS是一个开源的JMS规范的实现,它包含以下几个特征: - 它支持点到点模型和发布/订阅模型;
- 支持同步与异步消息发送;
- 可视化管理界面,支持Applet;
- 能够与Jakarta Tomcat这样的Servlet容器结合;
- 支持RMI、TCP、HTTP与SSL协议。