JMS、MQ及ActiveMQ的关系_爱上香锅的麻辣的博客-程序员秘密

技术标签: activemq  jms  java  消息中间件  mq  

一、JMS

定义:JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

简介:JMS是一种与厂商无关的 API,用来访问消息收发服务(消息中间件)。它类似于JDBC(Java DatabaseConnectivity):这里,JDBC 是可以用来访问许多不同关系数据库的API,而JMS同样提供与厂商无关的访问方式来访问消息收发服务,许多厂商目前都支持JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务从一个 JMS 客户机向另一个JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。

二、MQ

定义:MQ全称为消息队列(Message Queue), MQ是一种应用程序与应用程序之间的通信方法。应用程序通过消息队列来通信,而无需专用连接来链接它们。消息传递指的是程序通过在消息队列中收发数据进行通信,而不是通过直接调用彼此来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM的WEBSPHERE MQ。

MQ特点:MQ的消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。

使用场景:在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

三、三者之间的关系

JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的消息服务提供者。MQ的实现可以基于JMS,也可以基于其他规范或标准,其中ActiveMQ就是基于JMS规范实现的消息队列。

常见的基于JMS的MQ:

  • jbossmq(jboss 4)
  • jboss messaging (jboss 5)
  • joram-4.3.21 2006-09-22
  • openjms-0.7.7-alpha-3.zipDecember 26,2005
  • mantamq
  • ubermq
  • SomnifugiJMS 2005-7-27

四、ActiveMQ

ActiveMQ是Apache出品,最流行的,能力强劲的开源消息队列。ActiveMQ是一个完全支持JMS 1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

主要特点:

  1. 多种语言和协议编写客户端:Java, C, C++, C#, Ruby, Perl, Python, PHP;应用协议: OpenWire,Stomp REST,WSNotification,XMPP,AMQP。
  2. 完全支持JMS 1.1和J2EE 1.4规范 (持久化,XA消息,事务)。
  3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring 2.0的特性。
  4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上。
  5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA。
  6. 支持通过JDBC和journal提供高速的消息持久化。
  7. 从设计上保证了高性能的集群,客户端-服务器,点对点。
  8. 支持Ajax。
  9. 支持与Axis的整合。
  10. 可以很容易得调用内嵌JMS provider,进行测试。
  11. ActiveMQ速度非常快;一般要比jbossMQ快10倍。

优点:是一个快速的开源消息组件(框架),支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,XA,和J2EE1.4容器无缝结合,并且支持轻量级容器和大多数跨语言客户端上的Java虚拟机。消息异步接受,减少软件多系统集成的耦合度。消息可靠接收,确保消息在中间件可靠保存,多个消息也可以组成原子事务。

缺点:ActiveMQ默认的配置性能偏低,需要优化配置,但是配置文件复杂,ActiveMQ本身不提供管理工具;示例代码少;主页上的文档看上去比较全面,但是缺乏一种有效的组织方式,文档只有片段,用户很难由浅入深进行了解,文档整体的专业性太强。在研究阶段可以通过查maillist、看Javadoc、分析源代码来了解。

ActiveMQ应用场景:

  1. 不同语言应用集成。ActiveMQ 中间件用Java语言编写,因此自然提供Java客户端 API。但是ActiveMQ也为C/C++、.NET、Perl、PHP、Python、Ruby和一些其它语言提供客户端。在你考虑如何集成不同平台不同语言编写应用的时候,ActiveMQ拥有巨大优势。在这样的例子中,多种客户端API通过ActiveMQ 发送和接受消息成为可能,无论使用的是什么语言。此外,ActiveMQ还提供交叉语言功能,该功能整合这种功能,无需使用远程过程调用(RPC)确实是个优势,因为消息协助应用解耦。
  2. 作为RPC的替代。使用RPC同步调用的应用十分普遍。假设大多数客户端服务器应用使用RPC,包括ATM、大多数WEB应用、信用卡系统、销售点系统等等。尽管很多系统很成功,但是转换使用异步消息可以带来很多好处,而且也不会放弃响应保证。使用同步请求的系统在规模上有较大的限制,因为请求会被阻塞,从而导致整个系统变慢。如果使用异步消息替代,可以很容易增加额外的消息接收者,使得消息能被并发消耗,从而加快请求处理。当然,你的系统应用间应该是解耦的。
  3. 应用之间解耦。正如之前讨论的,紧耦合架构可以导致很多问题,尤其是如果他们是分布的。松耦合架构,在另一方面,证实了更少的依赖性,能够更好地处理不可预见的改变。不仅可以在系统中改变组件而不影响整个系统,而且组件交互也相当的简单。相比使用同步的系统(调用者必须等待被调用者返回信息),异步系统(调用方发送消息后就不管,即fire-and-forget)能够给我们带来事件驱动架构(event-driven architecture EDA)。
  4. 作为事件驱动架构的主干。解耦,异步架构的系统允许通过代理器自己配置更多的客户端,内存等(即vertical scalability)来扩大系统,而不是增加更多的代理器(即horizontal scalability)。考虑如亚马逊这样繁忙的电子商务系统。当用户购买物品,事实上系统需要很多步骤去处理,包括下单,创建发票,付款,执行订单,运输等。但是用户下单后,会立即返回“谢谢你下单”的界面。不只是没有延迟,而且用户还会受到一封邮件表明订单已经收到。在亚马逊下单的例子就是一个多步处理的例子。每一步都由单独的服务去处理。当用户下单是,有一个同步的体积表单动作,但整个处理流程并不通过浏览器同步处理。相反地,订单马上被接受和反馈。而剩下的步骤就通过异步处理。如果在处理过程中出错,用户会通过邮件收到通知。这样的异步处理能提供高负载和高可用性。
  5. 提高系统扩展性。很多使用事件驱动设计的系统是为了获得高可扩展性,例如电子商务,政府,制造业,线上游戏等。通过异步消息分开商业处理步骤给各个应用,能够带来很多可能性。考虑设计一个应用来完成一项特殊的任务。这就是面向服务的架构(service-oriented architecture SOA)。每一个服务完成一个功能并且只有一个功能。应用就通过服务组合起来,服务间使用异步消息和最终一致性。这样的设计便可以引入一个复杂事件处理概念(complex event processing CEP)。使用CEP,部件间的交互可以被记录追踪。在异步消息系统中,可以很容易在部件间增加一层处理。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011983531/article/details/49522691

智能推荐

OpenCV的下载、安装与配置_opencv vc9下载_关关雎鸠儿的博客-程序员秘密

预准备:下载和安装集成开发环境推荐使用Visual Stdio 2010以上的版本。第一步:下载和安装OpenCV SDK在官网找到OpenCV Windows版下载下来,自定义位置进行安装。第二步:配置环境变量计算机》属性》高级系统设置》高级》环境变量》在PATH中增加相应路径。对于32位系统,就添加“…opencv\build\x86\vcIO\bin”,和之前的就...

51Nod 2068 堆牌问题 c/c++题解_东瓜lqd的博客-程序员秘密

题目描述桌上有一叠牌,从顶面的牌开始往底面依次编号为 1~n。当至少还剩两张牌时进行以下操作:把第一张扔掉,然后把新的第一张放到整叠牌的最后。输入输入一个正整数 n,2<=n≤1000000,表示起始时牌的张数输出输出一行,按顺序输出每次扔掉的牌的编号,最后输出最后剩下的牌的编号,两个数之间用一个空格隔开。输入样例7输出样例1 3 5 7 4 2 6代码:#incl...

POM文件中,${xxx.version} 引用版本号爆红问题处理_生产队队长的博客-程序员秘密

情况描述: <!--统一管理jar包版本--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8&

SUPERBIN技术周刊第6期_uva测评_superbin的博客-程序员秘密

本期内容概览:算法竞赛入门经典第三章例题代码;用mpv实现多视频同步播放;pytorch模型导出成ONNX格式:支持多参数与动态输入;介绍一篇GTC2021演讲《3D Reconstruction for Game Development》;推荐音视频相关文章,《拥抱智能,AI视频编码技术的新探索》

Linux 之权限管理-文件特殊权限SetUID、SetGID和Sticky BIT_team39的博客-程序员秘密

Linux 之权限管理-文件特殊权限SetUID、SetGID和Sticky BITSetUID在所有者---中拥有s权限,例:passwd -rwsr-xr-x前提:只有执行二进制程序才能设定SUID要对该程序有X权限作用:任何一个普通用户在执行拥有SUID权限的程序时获得该程序文件所有者的身份。但只是在程序执行过程中有效设定SetUID:  4代表SUID——chmod 4755 文件名;ch...

C++ internal compiler error:killed (program cc1plus)_木可木可❀的博客-程序员秘密

1.问题描述在编译p4c的时候报了一个错c++: internal compiler error: Killed (program cc1plus)Please submit a full bug report主要是在编译过程中,内存不够造成的。2.解决方案使用swap创建临时分区sudo dd if=/dev/zero of=/swapfile bs=64M count=16#count的大小就是增加的swap空间的大小,64M是块大小,所以空间大小是bs*count

随便推点

android pppd流程,一种基于PPPD实现PPP‑Server功能的通信模块及其实现方法与流程..._weixin_39753674的博客-程序员秘密

本发明涉及计算机通信技术领域:,具体涉及一种基于PPPD实现PPP-Server功能的通信模块及其实现方法。背景技术::在网络通信技术领域:中,通常采用以下方式进行通信:如4G数据模块多采用应用处理器+BP一体化设计,一方面保证了BP部分的独立和稳定性,另一方面也增强了模块功能上的可扩展性。4G数据模块的PPP拨号功能是一个标配功能,默认仅对USB提供支持。4G数据模块提供对UART口支持PPP拨...

IntelliJ IDEA启动界面的秘密:当编程遇到艺术_chinaherolts2008的博客-程序员秘密

细心的同学会发现Intellij IDEA每次发版本的时候都会有不同的启动界面背景,都很比较抽象的艺术图像。2020.3的启动界面背景JetBrains的其它产品也有自己独特的设计。但是这背后是怎么实现的、有什么寓意却很少有人知道。今天让胖哥来带你解开这个答案。编码的艺术编码是一门艺术。说到这里你会很容易想到这肯定是利用编程实现的。是的,这里的图像生成器技术用了到机器学习中的神经网络技术。这些生成的图像本质上是前馈神经网络映射函数描绘的!基于传递给网络的确切数据,加上一些预设的生成算法(遗传算法

系统提示“d3dx9_43.dll丢失、找不到”原因与解决方案_diecha5775的博客-程序员秘密

相信很多朋友都有遇到过这种情况:在登陆游戏或打开某个软件时,系统会弹出一个窗口提示:“d3dx9_43.dll丢失” 或 ”d3dx9_43.dll找不到“,出现这种情况一般是系统的不完整性导致(非正版系统比较容易出现此问题),也可能是此文件被误删。d3dx9_43.dll它是directx的一个组件。而DirectX组件是Windows系统支持游戏和显卡游戏外设的程序接口,任何一个组件...

牛客剑指Offer面试题33:二叉搜索树的后序遍历序列_c# 遍歷二叉樹_kgbkqLjm的博客-程序员秘密

题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路二叉搜索树(二叉排序树/二叉查找树)定义:若它的左(右)子树不空,则左(右)子树上所有节点的值均小于(大于)它的根节点的值.意义:构建一棵二叉搜索树的目的不是为了排序,而是为了提高查找和删除关键字的速度.后序遍历序列的最后一个数字为根节点...

ARM嵌入式笔记2_ev.code_wu55uw的博客-程序员秘密

输入子系统由驱动层,输入子系统核心层(Input Core),和事件处理层(Event Handler)三个部分组成。一个输入事件,如鼠标移动,键盘按键按下,通过Driver-->Input Core-->Event Handler-->userspace的顺序到达用户空间的应用程序。驱动层:将底层的硬件输入转化为统一的事件形式,向输入核心(Input Core)汇报。输入核心层:为驱动层

如何在系统中生成唯一性ID的问题_odps自增id_super_kancy的博客-程序员秘密

       关于如何在系统中生成唯一性 ID 的问题(如订单号、批次号等),一直困扰了许久。因为还要考虑并发的问题,所以时间戳 + 随机数的组合并不可取,Java 中的 UUID 是一种可取的方法,但它的缺点是序列号太长了,而且没有可读性,对用户来说这么一堆乱码是极不友好的。  推特的工程师 snowflake 也提出了一个在分布式系统中生成唯一序列的方法。SnowFlake 的优点是,...

推荐文章

热门文章

相关标签