JMS(Java Message Service)是一个为Java平台设计的API,主要针对Java开发者提供了一套用于企业级消息服务的标准接口。而AMQP(Advanced Message Queuing Protocol)是一个应用层协议,它提供了一个开放的、标准化的消息传递框架,具有跨语言和跨平台的特性。它们在定义、跨平台和跨语言等方面存在差异。
JMS 简介
JMS(JAVA Message Service,java消息服务)是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。JMS(JAVA Message Service,Java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性,ActiveMQ 就是基于 JMS 规范实现的。
JMS的消息模型和消息格式
-
点到点(P2P)模型
使用队列(Queue)作为消息通信载体;满足生产者与消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。比如:我们生产者发送100条消息的话,两个消费者来消费一般情况下两个消费者会按照消息发送的顺序各自消费一半(也就是你一个我一个的消费。)
-
发布/订阅(Pub/Sub)模型
发布订阅模型(Pub/Sub)使用主题(Topic)作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者,在一条消息广播之后才订阅的用户则是收不到该条消息的。
-
JMS 五种不同的消息正文格式
JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。- StreamMessage – Java原始值的数据流
- MapMessage–一套名称-值对
- TextMessage–一个字符串对象
- ObjectMessage–一个序列化的 Java对象
- BytesMessage–一个字节的数据流
AMQP
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准 高级消息队列协议(二进制应用层协议),是应用层协议的一个开放标准,为面向消息的中间件设计,兼容 JMS。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品,不同的开发语言等条件的限制,RabbitMQ 是基于 AMQP 协议实现的。
常见的消息队列对比
Kafka: 以其高吞吐量和低延迟著称,特别适合大规模数据传输场景,如日志收集、实时数据处理等。它通过批量处理和磁盘顺序读写优化了性能,吞吐量可达到十万级别,延迟在毫秒级以内。
RabbitMQ: 基于Erlang开发,拥有较强的并发能力和较低的延迟,支持多种消息协议,适用于需要高并发和消息路由复杂度的场景。吞吐量通常在万级,延迟可达到微秒级。
RocketMQ: 阿里开源,后进入Apache孵化器,专为大规模分布式系统设计,具有高吞吐量、高可用性和低延迟的特点。吞吐量与Kafka相当,也在十万级别,延迟为毫秒级。其分布式架构使其在大规模场景下表现优秀。
ActiveMQ: 是一个成熟的消息中间件,广泛应用于各类项目中。尽管它的功能全面,但相比上述其他三种,在吞吐量和延迟上可能不占优势,通常吞吐量在万级,延迟为毫秒级。近年来,其活跃度和新功能的添加有所减缓。
总结
- ActiveMQ 的社区算是比较成熟,但是较目前来说,ActiveMQ 的性能比较差,而且版本迭代很
慢,不推荐使用。 - RabbitMQ 在吞吐量方面虽然稍逊于 Kafka 和 RocketMQ ,但是由于它基于 erlang 开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。但是也因为 RabbitMQ 基于 erlang 开发,所以国内很少有公司有实力做erlang源码级别的研究和定制。
- RocketMQ 阿里出品,Java 开源项目,源代码我们可以直接阅读,然后可以定制自己公司的
MQ,并且 RocketMQ 有阿里巴巴的实际业务场景的实战考验。RocketMQ 社区活跃度相对较为
一般,不过也还可以,文档相对来说简单一些,然后接口这块不是按照标准 JMS 规范走的有些系统要迁移需要修改大量代码。