JMS与AMQP与MQTT
JMS
Java消息服务(Java Message Service),Java平 台中关于⾯向消息中间件的接⼝。
JMS是⼀种与⼚商⽆关的 API,⽤来访问消息收发系统 消息,它类似于JDBC(Java Database Connectivity)。 这⾥,JDBC 是可以⽤来访问许多不同关系数据库的 API。
是由Sun公司早期提出的消息标准,旨在为java应⽤提 供统⼀的消息操作,包括create、send、receive。
特性
⾯向Java平台的标准消息传递API
在Java或JVM语⾔⽐如Scala、Groovy中具有互⽤性
⽆需担⼼底层协议
有queues和topics两种消息传递模型
⽀持事务、能够定义消息格式(消息头、属性和内容)
常⻅概念
JMS提供者:连接⾯向消息中间件的,JMS接⼝的⼀个 实现,RocketMQ,ActiveMQ,Kafka等等
JMS⽣产者(Message Producer):⽣产消息的服务
JMS消费者(Message Consumer):消费消息的服务
JMS消息:数据对象
JMS队列:存储待消费消息的区域
JMS主题:⼀种⽀持发送消息给多个订阅者的机制
JMS消息通常有两种类型:点对点(Point-to-Point)、 发布/订阅(Publish/Subscribe)
基础编程模型
MQ中需要⽤的⼀些类
ConnectionFactory :连接⼯⼚,JMS ⽤它创建连接
Connection :JMS 客户端到JMS Provider 的连接
Session: ⼀个发送或接收消息的线程
Destination :消息的⽬的地;消息发送给谁.
MessageConsumer / MessageProducer: 消息消费者,消息⽣产者
AMQP
JMS都没有标准的底层协议,它们可以在任何底层协议上运⾏,但是API是与编程语⾔绑定的,AMQP解决了这个问题,它使⽤了⼀套标准的底层协议。
AMQP(advanced message queuing protocol)在 2003年时被提出,最早⽤于解决⾦融领不同平台之间 的消息传递交互问题,就是⼀种协议,兼容JMS。
更准确说的链接协议 binary- wire-level-protocol 直接 定义⽹络交换的数据格式,类似http。
具体的产品实现⽐较多,RabbitMQ就是其中⼀种。
特性
独⽴于平台的底层消息传递协议
消费者驱动消息传递
跨语⾔和平台的互⽤性、属于底层协议
有5种交换类型direct,fanout,topic,headers, system
⾯向缓存的、可实现⾼性能、⽀持经典的消息队列,循环,存储和转发
⽀持⻓周期消息传递、⽀持事务(跨消息队列)
AMQP和JMS的主要区别
1.AMQP不从API层进⾏限定,直接定义⽹络交换的数据 格式,这使得实现了AMQP的provider天然性就是跨平台
⽐如Java语⾔产⽣的消息,可以⽤其他语⾔⽐如python 的进⾏消费
2.AQMP可以⽤http来进⾏类⽐,不关⼼实现接⼝的语⾔,只要都按照相应的数据格式去发送报⽂请求,不同语⾔的client可以和不同语⾔的server进⾏通讯
3.JMS消息类型: TextMessage/ObjectMessage/StreamMessage等
AMQP消息类型:Byte[]
MQTT
MQTT: 消息队列遥测传输(Message Queueing Telemetry Transport )
计算性能不⾼的设备不能适应AMQP上的复杂操 作,MQTT它是专⻔为⼩设备设计的。
MQTT主要是是物联⽹(IOT)中⼤量的使⽤。
特性
内存占⽤低,为⼩型⽆声设备之间通过低带宽发送 短消息⽽设计。
不⽀持⻓周期存储和转发,不允许分段消息(很难 发送⻓消息)。
⽀持主题发布-订阅、不⽀持事务(仅基本确认)。
消息实际上是短暂的(短周期)。
简单⽤户名和密码、不⽀持安全连接、消息不透明。