消息传递作为基本通信机制已经在全世界成功运用。无论是人与人、机器与人还是机器与机器之间,消息传递一直都是唯一常用的通信方式。在双方(或更多)之间交换消息有两种基本机制。

  1. 同步消息传递
  2. 异步消息传递

同步消息传递在这种情况下使用,当消息发送者希望在某个时间范围内收到响应,然后再进行下一个任务。基本上就是他在收到响应前一直处于“阻塞”状态。

异步消息意味着发送者并不要求立即收到响应,而且也不会阻塞整个流程。响应可有可无,发送者总会执行剩下的任务。

上面提到的技术,当两台计算机上的程序相互通信的时候,就广泛使用了异步消息传递。随着微服务架构的兴起,很明显我们需要使用异步消息传递模型来构建服务。

这一直是软件工程中的基本问题,而且不同的人和组织机构会提出不同的方法。我将介绍在企业IT系统中广泛使用的三种最成功的异步消息传递技术。

Java消息传递服务(Java Messaging Service (JMS))

JMS是最成功的异步消息传递技术之一。随着Java在许多大型企业应用中的使用,JMS就成为了企业系统的首选。它定义了构建消息传递系统的API。

图片来源:http://www.javatpoint.com/jms-tutorial

下面是JMS的主要特性:

  • 面向Java平台的标准消息传递API
  • 在Java或JVM语言比如Scala、Groovy中具有互用性
  • 无需担心底层协议
  • 有queues和topics两种消息传递模型
  • 支持事务
  • 能够定义消息格式(消息头、属性和内容)

高级消息队列协议(Advanced Message Queueing Protocol (AMQP))

JMS非常棒而且人们也非常乐意使用它。微软开发了NMS(.NET消息传递服务)来支持他们的平台和编程语言,它效果还不错。但是碰到了互用性的问题。两套使用两种不同编程语言的程序如何通过它们的异步消息传递机制相互通信呢。此时就需要定义一个异步消息传递的通用标准。JMS或者NMS都没有标准的底层协议。它们可以在任何底层协议上运行,但是API是与编程语言绑定的。AMQP解决了这个问题,它使用了一套标准的底层协议,加入了许多其他特征来支持互用性,为现代应用丰富了消息传递需求。

图片来源:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_MRG/2/html-single/Messaging_Programming_Reference/index.html

下面是AMQP的主要特性:

  • 独立于平台的底层消息传递协议
  • 消费者驱动消息传递
  • 跨语言和平台的互用性
  • 它是底层协议的
  • 有5种交换类型direct,fanout,topic,headers,system
  • 面向缓存的
  • 可实现高性能
  • 支持长周期消息传递
  • 支持经典的消息队列,循环,存储和转发
  • 支持事务(跨消息队列)
  • 支持分布式事务(XA,X/OPEN,MS DTC)
  • 使用SASL和TLS确保安全性
  • 支持代理安全服务器
  • 元数据可以控制消息流
  • 不支持LVQ
  • 客户端和服务端对等
  • 可扩展

消息队列遥测传输(Message Queueing Telemetry Transport (MQTT))

现在我们已经有了面向基于Java的企业应用的JMS和面向所有其他应用需求的AMQP。为什么我们还需要第三种技术?它是专门为小设备设计的。计算性能不高的设备不能适应AMQP上的复杂操作,它们需要一种简单而且可互用的方式进行通信。这是MQTT的基本要求,而如今,MQTT是物联网(IOT)生态系统中主要成分之一。

图片来源:https://zoetrope.io/tech-blog/brief-practical-introduction-mqtt-protocol-and-its-application-iot

下面是MQTT的主要特性:

  • 面向流,内存占用低
  • 为小型无声设备之间通过低带宽发送短消息而设计
  • 不支持长周期存储和转发
  • 不允许分段消息(很难发送长消息)
  • 支持主题发布-订阅
  • 不支持事务(仅基本确认)
  • 消息实际上是短暂的(短周期)
  • 简单用户名和密码,基于没有足够信息熵的安全
  • 不支持安全连接
  • 消息不透明
  • Topic是全局的(一个全局的命名空间)
  • 支持最新值队列(Last Value Queue (LVQ) )
  • 客户端和服务端不对称
  • 不能扩展

--------------------- 本文来自 dongfengkuayue 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/dongfengkuayue/article/details/51329110?utm_source=copy

jms、amqp、mqtt区别与联系的更多相关文章

  1. JMS和AMQP的区别

    JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信 ...

  2. 几种常用远程通信技术(RPC,Webservice,RMI,JMS)的区别

    原文链接:http://blog.csdn.net/shan9liang/article/details/8995023 RPC(Remote Procedure Call Protocol) RPC ...

  3. AMQP && MQTT comparision

    1. AMQP (Advanced Message Queuing Protocol) 2. MQTT (Message Queuing Telemetry Transport) Introducti ...

  4. 物联网通信协议——比较-MQTT、 DDS、 AMQP、XMPP、 JMS、 REST、 CoAP

    物联网通信协议——比较-MQTT. DDS. AMQP.XMPP. JMS. REST. CoAP   AMQP & MQTT & DDS (https://www.youtube.c ...

  5. AMQP & JMS对比(转载)

    AMQP & JMS对比 原文地址:https://blog.csdn.net/hpttlook/article/details/23391967 初次接触消息队列时,在网上搜索,总是会提到如 ...

  6. 消息队列之JMS和AMQP对比

    https://blog.csdn.net/hpttlook/article/details/23391967 AMQP & JMS对比 初次接触消息队列时,在网上搜索,总是会提到如JMS.A ...

  7. 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表

    1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...

  8. 聊聊消息中间件(1),AMQP那些事儿

    开篇 说到消息队列,相信大家并不陌生.大家在日常的工作中其实都有用过.相信大部分的研发在使用消息队列的过程中也仅仅是停留在用上面,里面的知识点掌握得并不是很系统,有部分强大的功能可能由于本身公司的业务 ...

  9. MQTT协议之 Apache Apollo服务

    一.说明 MQTT是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网) ...

随机推荐

  1. (原创)Stanford Machine Learning (by Andrew NG) --- (week 5) Neural Networks Learning

    本栏目内容来自Andrew NG老师的公开课:https://class.coursera.org/ml/class/index 一般而言, 人工神经网络与经典计算方法相比并非优越, 只有当常规方法解 ...

  2. [转]mybatis 的简单使用

      需要用到的包:(这里只是其中一个版本,其他的百度) mysql-connector-java-5.1.6-bin mybatis-3.2.2 先看项目目录: 配置文件mybatisconfig.x ...

  3. centos下防火墙iptables日志学习笔记

    一直找不到日志方面怎么弄,问了同事,同事给了个网址: http://www.thegeekstuff.com/2012/08/iptables-log-packets/ 下面就是我根据这个网址里面的设 ...

  4. NHibernate官方文档中文版--ISessionFactory的配置(ISessionFactory Configuration)

    由于NHibernate是被设计应用在许多不同环境中的,因此它存在很多配置参数.幸运的是,这些参数大多都有合理的默认值,而且NHibernate发布的时候伴随着一个App.config 例子(可在sr ...

  5. 为Go语言GC正名-20秒到100微妙的演变史

    http://blog.csdn.net/erlib/article/details/51850912 https://blog.twitch.tv/gos-march-to-low-latency- ...

  6. 通过HttpServletRequest转换获得json对象

    如何把前端传过来的Json对象解析出来?在java web应用中,我们如何获取post请求body中的内容?通常利用request获取参数可以直接通过req.getParameter(name)的方式 ...

  7. [Guava] EventBus

    1.  发布-订阅模式 发布-订阅模式(publish-subscribe)是一种编程范式,发布方不发布消息给特定的接收方,而是由订阅方选择性接收.这使得发布方和订阅方相对独立,减少了耦合性. 在发布 ...

  8. EEPlat 与 SOA

    EEPlat具有良好的可集成性和高度的系统开放性. EEPlat中系统级的服务由业务对象的服务通过规则引擎定义的业务逻辑组织建立起来.系统级的服务和业务对象的服务都可以直接公布为WebService供 ...

  9. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何在程序中添加注释

    在TwinCAT2中,(*中间输入注释*),也可以用这种方法批量注释,在TwinCAT3中,使用//即可     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youk ...

  10. PHP和数据访问之(插入。删除。和更新数据)

    插入: <?php $conn=@new mysqli('localhost','root','123','mytestdb'); $q_str=<<<EOM insert i ...