什么是MQ?
MQ全称为Message Queue, 消息队列(MQ)是应用程序“对”应用程序的通信方法。
MQ:生产者者往消息队列中写消息,消费可以读取队列中的消息。
下一代编程 : 响应式编程
spring boot 2.2提供非阻塞
- RSocket协议
- spring-boot-starter-data-redis-reactive,
- spring-boot-starter-data-mogodb-reactive等
采用netty(Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序)。tomcat9内置Netty。
常见的MQ
Apache ActiveMQ
- https://activemq.apache.org/
- Apache ActiveMQ™基于Java的消息服务器。它支持行业标准协议,因此用户可以通过广泛的语言和平台获得客户选择的好处。可以使用C,C ++,Python,.Net等连接。使用无处不在的AMQP协议集成您的多平台应用程序。使用STOMP通过websockets 在Web应用程序之间交换消息。使用MQTT管理您的IoT设备。支持您现有的JMS基础架构及其他。ActiveMQ提供强大的功能和灵活性,以支持任何消息传递用例。
- 目前有两种的ActiveMQ可供选择经典5.x和下一代Artemis。一旦Artemis与5.x代码库达到足够的功能奇偶校验,它将成为ActiveMQ 6.初始迁移文档可用。
ActiveMQ 5
- JMS 1.1具有完整的客户端实现,包括JNDI
- 使用共享存储的高可用性
- 熟悉的基于JMS的寻址模型
- 用于分配负载的“经纪人网络”
- 用于持久性的KahaDB和JDBC选项
ActiveMQ Artemis
用于下一代事件驱动的消息传递应用程序的高性能,非阻塞体系结构。
- JMS 1.1和2.0,包括JNDI在内的完整客户端实现
- 使用共享存储或网络复制的高可用性
- 简单而强大的协议无关寻址模型
- 灵活的群集,用于分配负载
- 用于低延迟持久性和JDBC的高级日志实现
- 与ActiveMQ 5实现高特性奇偶校验,以简化迁移动
Apollo
- 已难产
Apache Kafka
- Kafka作为一个集群,运行在一台或者多台服务器上.
- Kafka 通过 topic 对存储的流数据进行分类。
- 每条记录中包含一个key,一个value和一个timestamp(时间戳)
Kafka有四个核心的API:
- The Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
- The Consumer API 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。
- The Streams API 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
- The Connector API 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。
Apache RocketMQ
- 由Alibaba提交到 Apache
- RocketMQ 出现原因:在早期阶段,alibaba构建了基于ActiveMQ 5.x的分布式消息中间件(5.3之前)。alibaba的跨国业务将其用于异步通信,搜索,社交网络活动流,数据管道,甚至在其交易流程中。随着alibaba的贸易业务吞吐量的增加,源自alibaba的消息传递集群的压力也变得迫切。
- RocketMQ vs. ActiveMQ vs. Kafka
参考:http://rocketmq.apache.org/docs/motivation/
- 没有在 mq 核心中去实现JMS等接口,有些系统要迁移需要修改大量代码
ZeroMQ
基于c语言开发的主要为C语言设计,也支持PHP,Java,Python,Lua,Haxe.不支持持久化消息
RabbitMQ
由戴尔旗下的软件公司Pivotal设计,Pivotal(https://pivotal.io/cn/)你可能没用听过,spring就是由Pivotal公司设计。
由Erlang 语言开发,并发性能很好
异步消息支持多种消息传递协议,消息队列,传递确认,灵活路由到队列,多种交换类型。
如何选择?
通过以上分析只剩下RabbitMQ和RocketMQ
二次开发角度 :RocketMQ
- RabbitMQ二次开发比较困难些因为是Erlang语言开发
- RocketMQ java编写
- Alibaba当初MQ选择方案中没用RabbitMQ我觉得就是这个原因
成熟度:RabbitMQ
- RabbitMQ:2008-7-30发布第一个版本
- RocketMQ:2017-2-7发布第一个版本