消息中间件与JMS标准
初识消息中间件
维基百科上对于消息中间件的定义是"Message-oriented middleware(MOM) is software infrastructure focused on sending and receiving messages between distrubuted systems"。解释起来就是消息中间件是在分布式系统中完成消息的发送和传递的基础软件。看张图来更直观地理解消息中间件:

看到消息中间件有两个好处:
1、异步
2、解耦
应用A和应用B都和消息中间件打交道,这两个应用之间并不直接联系,这样就完成了解耦,目的是希望收发消息的双方彼此不知道对方的存在,也不受对方的影响,所以将消息投递给接收者实际上都采用了异步的方式。
透过示例看消息中间件对应用的解耦
以苹果的App Store为例吧,App Store有一个功能:用户充值成功后向用户手机发送一条短信,算是一个安全选项。最直观的,我们会这么实现:

然后,我们需要把用户付款的信息(用户名、时间、IP等数据)传给安全系统,安全系统会根据安全策略进行相关的判断和处理,因此结构变成:

这么看起来还好,那么如果再增加一些要被调用的系统呢?比如:

这会让付款系统变得非常复杂,每增加一个在付款成功之后需要调用的系统,就需要修改付款系统来进行相关的调用。优雅一点的实现是把这个付款成功后的服务调用变为一种可扩展的配置,甚至可以动态生效,但这只能降低变更时的开发和部署成本,并没有降低复杂性。付款系统被迫要依赖非常多的系统。
引入消息中间件进行服务解耦
可以考虑一下,从付款的角度看,这些系统是付款系统必须依赖的吗?答案是否定的,付款系统只需要验证用户账号、付款账号、付款密码的合法性,所以付款系统依赖的是能够系统用户账号、付款账号、付款密码的系统,而上图中的系统其实都不是付款系统必须依赖的系统。相反,这些系统都是必须依赖付款系统的,因为它们都关心付款是否成功。
在这样的场景中,我们需要通过消息中间件把上面的结构解耦,上面结构中的服务调用将会被固定格式的消息传递所取代。付款系统负责向消息中间件发送消息,而其他的系统则向消息中间件来订阅这个消息,然后完成自己的工作,如图所示:

这样,通过消息中间件,付款系统就不需要关心到底有多少个系统需要知道付款成功这件事情了,也不用关心如何通知它们,只需要把登陆成功这件事情转化为一个消息发送到消息中间件就好了,这样,需要了解付款成功这件事情的系统自己去消息中间件订阅就行了,并且各个系统之间也是互不影响的。
JMS概述
JMS是Java Message Service的缩写,即Java消息服务,它是Java EE中一个关于消息的规范,而Hornetq、ActiveMQ等产品是对这个规范的实现。如果是企业内部或者一些小型的系统,直接使用JMS的实现产品是一个经济的选择,而在大型系统中有一些场景不适合使用JMS。
在大型互联网中,我们采用消息中间件可以进行应用之间的解耦以及操作的异步,这是消息中间件两个最基础的特点,也正是我们所需要的。在此基础上,我们着重思考的是消息的顺序保证、扩展性、可靠性、业务操作与消息发送一致性,以及多集群订阅者等方面的问题。当然,这些我们要思考的东西,JMS都已经想到了,先看下JMS能帮开发者做什么:
1、定义一组消息公用概念和实用工具
所有Java应用程序都可以使用JMS中定义的API去完成消息的创建、接收与发送,任何实现了JMS标准的MOM都可以作为消息的中介,完成消息的存储转发
2、最大化消息应用程序的可移植性
MOM提供了有保证的消息发送,应用程序开发人员无需了解远程过程调用(PRC)和网络/通信协议的细节,提供了程序的可移植性
3、最大化降低应用程序与应用程序之间的耦合度
由于MOM的存在,各个应用程序只关心和MOM之间如何进行消息的接收与发送,而无须关注MOM的另一边,其他程序是如何接收和发送的
JMS两种消息模型
1、点对点模型
点对点模型(Pointer-to-Pointer)类似这样:

这种模型总结几点:
(1)一个消息中间件关联多个队列生产者和消费者
(2)一条消息仅仅能被一个消费者消费
(3)多个消费者正在监听队列上的消息,那么中间件将根据先来先得的原则确定由哪个消费者接收下一条消息,如果没有消费者正在监听队列,那么消息将保留在中间件中,直至消费者连接到中间为止
(4)收到消息后消费者必须确认消息已被接收,否则中间件江认为该消息没有被接收,那么这条消息仍然可以被其他消费者接收。程序可以自动确认,不需要人工干预
(5)生产者和消费者的运行先后没有限制
(6)此模型中,消息不是自动推送给消费者的,而是要消费者中间件中请求获得
2、发布/订阅模型
发布/订阅(Publish-Subscribe)模型类似这样:

这种模型中,还是以分点的形式总结:
(1)有一个重要的概念topic,可以认为是主题
(2)生产者发布消息,消费者订阅感兴趣的消息,生产者将消息和一个特定的topic(主题)连在一起,中间件将根据消费者注册的topic,将消息传递给消费者
(3)发布/订阅模式允许多个消费者接收同一条消息,只要这些消费者注册了同一个主题
(4)消费者必须先运行,订阅主题,然后再等待生产者运行,这么点对点模型有所差别
(5)该模型中,消息会自动广播,消费者无须通过主动请求或者轮训主题的方法来获得新的消息
JMS为提供的要素
JMS为发开者提供了很多的要素,看一下比较重要的几个:
| 要 素 | 作 用 |
| Destination | 表示消息所走通道的目标定义,,用来定义消息从发送端发出后要走的通道,而不是接收方。Destination属于管理类对象 |
| ConnectionFactory | 顾名思义,用于创建连接对象,ConnectionFactory属于管理类的对象 |
| Connection | 连接接口,所负责的重要工作时创建Session |
| Session | 会话接口,这是一个非常重要的对象,消息发送者、消息接收者以及消息对象本身,都是通过这个会话对象创建的 |
| MessageConsumer | 消息的消费者,也就是订阅消息并处理消息的对象 |
| MessageProducer | 消息的生产者,也就是用来发送消息的对象 |
| XXXMessage | 指各种类型的消息对象,包括ByteMesage、ObjectMessage、StreamMessage和TextMessage这5种 |
在JMS消息模型中,根据点对点模式和发布/订阅模式,这些要素由扩展出了各自的内容:
| JMS标准 | 点对点模式 | 发布/订阅模式 |
| ConnectionFactory | QueueConnectionFactory | TopicConnectionFactory |
| Connection | QueueConnection | TopicConnection |
| Destination | Queue | Topic |
| Session | QueueSession | TopicSession |
| MessageProducer | QueueSender | TopicPublisher |
| MessageConsumer | QueueReceiver | TopicSubscriber |
JMS是一个标准,具体还是依赖实现,当前常见的JMS实现有ActiveMQ、ZeroMQ、RabbitMQ等,Kafka是一种类似JMS的实现,下一篇文章将会重点讲解一下Kafka,至于为什么,还是和以前写文章一样的原因,因为工作用,呵呵。
消息中间件与JMS标准的更多相关文章
- 消息中间件和JMS介绍
在一个公司创立初期,他可能只有几个应用,系统之间的关联也不是那么大,A系统调用B系统就直接调用B提供的API接口:后来这个公司做大了,他一步步发展有了几十个系统,这时候A系统要调用B系统的接口,但是B ...
- 理解面向消息中间件及JMS 以及 ActiveMQ例子
为了帮助你理解ActiveMQ的意义,了解企业消息传送背景和历史是很重要的.讨论完企业消息传送,你将可以通过一个小例子了解JMS及其使用.这章的目的是简要回顾企业消息传送及JMS规范.如果你已经熟悉这 ...
- 消息中间件和JMS介绍(一)
在一个公司创立初期,他可能只有几个应用,系统之间的关联也不是那么大,A系统调用B系统就直接调用B提供的API接口:后来这个公司做大了,他一步步发展有了几十个系统,这时候A系统要调用B系统的接口,但是B ...
- 消息队列入门(三)JMS标准及实现
>>消息中间件 消息中间件即Message-oriented middleware(MOM),消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集 ...
- 消息中间件解决方案JMS
1. JMS入门 1.1消息中间件 1.1.1品优购系统模块调用关系分析 我们现在讲品优购已经完成的功能模块梳理如下: 我们已经完成了5个web模块和4个服务模块.其中运营商后台的调用关系最多,用到了 ...
- 消息中间件--ActiveMQ&JMS消息服务
### 消息中间件 ### ---------- **消息中间件** 1. 消息中间件的概述 2. 消息中间件的应用场景 * 异步处理 * 应用解耦 * 流量削峰 * 消息通信 --------- ...
- JMS总结
一 什么是JMS 1.JMS,Java Message Service,Java消息服务是一种可以实现异步通讯的消息中间件MOM(Message Oriented Middleware,面向消息的中间 ...
- JMS基本概念和模型
------------------------------------------------------------------------------------------- JMS是什么 J ...
- JMS学习(一)基本概念
这两天面试了一两个公司,由于简历中的最近一个项目用到了JMS,然而面试官似乎对这个很感兴趣,所以都被问到了,但可惜的是,我除了说我们使用了JMS外,面对他们提出的一些关于JMS的问题,我回答得相当差, ...
随机推荐
- Nodejs Express下引入本地文件的方法
Express的结构如下: |---node_modules------用于安装本地模块. |---public------------用于存放用户可以下载到的文件,比如图片.脚本文件.样式表 ...
- touchstart,touchmove判断手机中滑屏方向
滑动屏幕 touchstart:接触屏幕时触发,touchmove:活动过程触发,touchend:离开屏幕时触发 首先获取手接触屏幕时的坐标X,Y //获取接触屏幕时的X和Y$('body') ...
- 两表(多表)关联update的写法
SQL Server示例: update a set a.gqdltks=b.gqdltks,a.bztks=b.bztks from landleveldata a,gdqlpj b where a ...
- block的解析
1. 操作系统中的栈和堆 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方 ...
- Being a Good Boy in Spring Festival 尼姆博弈
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descr ...
- Linux 忘记root登录密码解决方法
很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步骤如下: 重启linux系统 3 ...
- 自定义actionbar标题
这是我自己封装的一个activity,主要作为所有Activity的基类,可以一键关掉所有的activity, 并共享一个自定义actionbar.直接切入主题吧. 第一步就是创建自定义标题的布局文件 ...
- 第五章:Logistic回归
本章内容 □sigmod函数和logistic回归分类器 □最优化理论初步□梯度下降最优化算法□数据中的缺失项处理 这会是激动人心的一章,因为我们将首次接触到最优化算法.仔细想想就会发现,其实我们日常 ...
- Ubuntu搭建Ruby on Rails环境
安装Ruby 由于Ubuntu的apt包管理器的ruby版本过旧,故考虑从源码编译安装.这里以安装ruby2.3.0为例: sudo apt-get install build-essential z ...
- CAP定理
from wikipedia CAP定理 CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致 ...