因为之前用的是JMS,领导要求用rabbitMQ,所以我也和AMQP取得了联系。下面是这两个的总结和一个备忘录!
JMS一般来说,提到JMS(Java MessageService)其实就是指JMS API。JMS是Sun公司提出的早期消息标准,旨在为java应用提供统一的消息操作,包括创建、发送和接收。
等等。JMS已经成为Java企业版的一部分。从使用角度来看,JMS和JDBC扮演着类似的角色,用户可以与JMS实现的服务进行通信,并根据相应的接口执行相关操作。
JMS通常包括以下角色:
JMS提供了两种消息模型,对等(peer-2-peer)和发布-订阅(publish-subscribe)。当采用对等模型时,消息将被发送到一个队列中,该队列中的消息只能被一个消费者消费。然而,使用发布-订阅模型,消息可以被多个消费者使用。在发布订阅模式下,生产者和消费者是完全独立的,不需要感知对方的存在。
消息如何从生产者端到达消费者端取决于消息路由。在JMS中,消息路由非常简单。生产者和消费者链接到同一个队列(p2p)或主题(pub/sub)来实现消息路由。JMSconsumer还支持消息选择器,通过它,使用者可以只使用那些通过了选择器过滤器的消息。在JMS兄弟中,消息路由机制的示意图如下:
常见的消息队列大多实现了JMS API,可以扮演JMS提供者的角色,如ActiveMQ、Redis、RabbitMQ等。
AMQPAMQP(Advanced Message Queuing Protocol,高级消息队列协议)于2003年提出,最早用于解决金融领导不同平台之间的消息交互问题。顾名思义,AMQP是一种协议,更准确地说是一种二进制线路级协议(链路协议)。这是AMQP和JMS的本质区别。AMQP不限于API层,而是直接定义了网络交换的数据格式。这使得AMQP的提供商性质是跨平台的。这意味着我们可以使用Java的AMQP提供者和python的生产者以及rubby的消费者。从这个角度来看,AQMP可以与http类比,不考虑实现的语言。只要每个人按照相应的数据格式发送消息请求,不同语言的客户端就可以与不同语言的服务器链接。
AMQP的messagerouting和JMS有一些区别,AMQP增加了交换和绑定的角色。生产者将消息发送给交换,绑定决定交换的消息应该发送到哪个队列,消费者直接从队列中消费消息。队列交换的绑定由消费者决定。AMQP的路由方案如下所示:
目前,AMQP已经逐渐成为消息队列的标准协议,流行的rabbitmq和stormmq已经由AMQP实现。
JMS和AMQP的各项对比一张图显示:
事实上,与JMS相比,基于AMQP的RabbitMQ具有路由灵活、消息可靠的特点。当有多样化的路由策略和可靠的消息传输需求时,可以考虑基于AMQP的产品。后面会分享更多关于devops和DBA的内容,感兴趣的朋友可以关注一下~