详细介绍了JMS规范和AMQP协议的内容与区别。

文章目录

  • 1 JMS
    • 1.1 JMS消息模型
  • 2 AMQP
    • 2.1 AMQP消息模型
  • 3 对比

1 JMS

JMS(JAVA Message Service),即Java消息服务,Java程序可以通过JMS服务进行异步的消息传输。JMS API是一个Sun公司提出的消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台通过统一的接口创建、发送、接收和读取消息,这类似于JDBC规范,与具体的厂商实现无关。

ActiveMQ 就是基于 JMS 规范实现的。

1.1 JMS消息模型

有两种模型,这也几乎是所有消息队列都有的模型:队列模型和**发布****/**订阅模型。RabbitMQ 采用队列模型,RocketMQ和Kafka 采用发布/订阅模型。

点到点(P2P)模型,发送者、接受者、消息队列。

使用队列(Queue)作为消息通信载体;满足生产者与消费者模式,一个queue可以有很多消费者,但一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。比如:我们生产者发送100条消息的话,两个消费者来消费一般情况下两个消费者会按照消息发送的顺序各自消费一半(也就是你一个我一个的消费)。

发布/订阅(Pub/Sub)模型,发布者、订阅者、主题。

发布订阅模型(Pub/Sub) 使用主题(Topic)作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者。如果只有一个订阅者,那它和队列模型就基本是一样的了,该模型在功能层面上是兼容队列模型的。

2 AMQP

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议(二进制应用层协议),是应用层协议的一个开放标准,为面向消息的中间件设计,兼容JMS。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品,不同的开发语言等条件的限制。

RabbitMQ 就是基于 AMQP 协议实现的。

2.1 AMQP消息模型

AMQP在消息的生产者以及传递信息的队列之间引入了一种间接的机制:Exchange,实现了生产者和队列的解耦。

binding是exchange和queue之间的虚拟连接,binding中可以包含binding key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。

message首先到达Exchange,随后Exchange根据分发规则,匹配查询表中的routing key,当满足路由规则是,会将分发消息到对应的queue中去。

AMQP提供四种不同类型的Exchange:

  1. Direct(point-2-point点对点模式):当Message中的routing key和Binding中的binding key完全一致,那么Exchange将message发到对应的queue中。
  2. Fanout(多播模式):每个发到Fanout类型Exchange的message都会分到所有绑定的queue上去。
  3. Topic (发布-订阅模式):当Message中的routing key和Binding中的binding key符合通配符匹配规则,那么Exchange将分发到目标queue中。
  4. headers:是使用消息内容中的headers属性(一个map的形式)来匹配,通过判断headers中的键值对值能否匹配队列和交换器绑定时指定的键值对值来进行路由。

3 对比

对比方向 JMS AMQP
定义 Java API 协议
跨语言
跨平台
支持消息类型 提供两种消息模型: Peer-2-Peer和Pub/Sub 提供了五种消息模型:direct exchange、fanout exchange、topic change、headers exchange、system exchange。本质来讲,后四种和JMS的pub/sub模型没有太大差别,仅是在路由机制上做了更详细的划分;
支持消息类型 支持多种消息类型:StreamMessage(Java原始值的数据流)、MapMessage(一套名称-值对)、TextMessage(一个字符串对象)、ObjectMessage(一个序列化的 Java对象)、BytesMessage(一个字节的数据流)、Message (只有消息头和属性) byte[ ](二进制)
实现 ActiveMQ RabbitMQ

AMQP 为消息定义了线路层(wire-level protocol)的协议,而JMS所定义的是API规范。

在 Java 体系中,多个client均可以通过JMS使用统一的API进行交互,不需要应用修改代码,但是其对跨平台的支持较差。

而AMQP不从API层进行限定,而是直接定义网络交换的数据格式,无论生产者和消费者用什么语言编写,这样消息格式符合规则就能通信,这使得AMQP协议天然具有跨平台、跨语言特性。

JMS 支持TextMessage、MapMessage 等复杂的消息类型;而 AMQP 仅支持 byte[] 消息类型(复杂的类型可序列化后发送)。

由于Exchange提供的路由算法,AMQP可以提供多样化的路由方式来传递消息到消息队列,而 JMS 仅支持队列和主题/订阅方式两种。

如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

MQ消息队列的JMS规范和AMQP协议的区别相关推荐

  1. JMS规范和AMQP协议

    1.JMS经典模式详解 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM,Message oriented Middle ...

  2. MQ消息队列之前置知识

    目录 一.前置知识 二.MQ前置知识 1.MQ作用 2.MQ对比 3.MQ的缺点 4.产品选型 一.前置知识 当今互联网项目微服务架构成为主流,使用微服务架构,在高并发场景下,服务之间的通信问题是我们 ...

  3. MQ消息队列中间件:

    MQ消息队列中间件: 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应. 异步通讯:就像发信息,不需要马上回复. 同步调用的优点: 时效性较强,可以立即得到结果 同步调用的问题: ...

  4. MQ消息队列详解、四大MQ的优缺点分析

    MQ消息队列详解.四大MQ的优缺点分析 前言 面试题切入 面试官心理分析 面试题剖析 ①为什么要使用MQ 系统解耦 异步调用 流量削峰 消息队列的优缺点 四大主流MQ(kafka.ActiveMQ.R ...

  5. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  6. PHP面试要点——MQ消息队列

    MQ消息队列 常见的消息队列有RabbitMQ.kafka.redis RabbitMQ RabbitMQ是使用Erlang编写的一个开源消息队列,本身支持很多协议,实现了AMQP协议,重量级的.实现 ...

  7. MQ消息队列的使用(邮件的发送)

    MQ消息队列的使用(邮件的发送) MQ消息队列 A:利用Maven加载相关的jar报,当然也可以自己写MQ,用来生产者的消息 jms交给spring进行管理 C.生产者配置 D.创建生产者消息转换器 ...

  8. 多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了

    1.引言 对于即时通讯网来说,所有的技术文章和资料都在围绕即时通讯这个技术方向进行整理和分享,这一次也不例外.对于即时通讯系统(包括IM.消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市 ...

  9. 阿里云ACE共创空间——MQ消息队列产品测试

    一.产品背景 消息队列是阿里巴巴集团自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息订阅和发布.消息轨迹查询.定时(延时)消息.资源统计.监控报警等一系列消息云服务,是企业级互联网架 ...

最新文章

  1. 数据结构与算法 -- 二叉树 ADT
  2. 上网课的心得体会1000字_【家庭教育】家庭教育心得体会 ——济南市罗而小学家庭教育“好家风好家教”专栏(十一)...
  3. Xcode打包上传时,最后一步出现An error occurred uploading to the iTunes Store.的解决方法...
  4. java B2B2C springmvc mybatis多租户电子商城系统 (七)springboot开启声明式事务
  5. 选择排序(C++/Java实现)
  6. 使用Fiddler进行http抓包和调试
  7. Spark入门(一)概述
  8. 圆形连接器工业M8连接器M12连接器UL认证安装螺钉扭力测试国际IEC标准
  9. 怎样选择合适的电流继电器
  10. windows2019关闭Windows server的IE浏览器的增强安全配置
  11. Frobenius自同构
  12. 【dp】LGTB 玩THD
  13. 【3】天猫精灵开放实验平台实验— 切换意图,参数传递
  14. 一条语句查询出所有雇员的编号、姓名、性别、出生日期、电话号码部门名称和本月收入
  15. sojson JS 逆向二 (免费版)
  16. SQL Server数据库表的基本操作(批量插入、删除、查询数据,删除表中重复数据方法)
  17. 大数据环境下互联网行业数据仓库/数据平台的架构之漫谈
  18. antDesign 修改日历(Calendar) 的一二三四五六日为周一周X格式
  19. CocosCreator之属性装饰器
  20. 迪米特法则(LOD)

热门文章

  1. k近邻算法中k值得选择
  2. 迅雷高速通道被举报无法下载问题
  3. 当你碰到那个把你宠的又甜又可爱的那个人,你才知道,破茧成蝶有多美。
  4. 多音轨DVD转VCD的方法
  5. MTK6761/MT6762使用LPDDR3注意事项
  6. 【内含实物图】一款可独立行走且支持远程对话的微型巡逻摄像头——硬件方案
  7. 神奇的Grails:自关联的树状Domain一行代码获取所有子节点
  8. 项目管理整理第二篇:项目计划(4)——质量计划
  9. 考研C语言程序练习0722
  10. STM32通过串口控制42步进电机