初识消息中间件

维基百科上对于消息中间件的定义是"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标准的更多相关文章

  1. 消息中间件和JMS介绍

    在一个公司创立初期,他可能只有几个应用,系统之间的关联也不是那么大,A系统调用B系统就直接调用B提供的API接口:后来这个公司做大了,他一步步发展有了几十个系统,这时候A系统要调用B系统的接口,但是B ...

  2. 理解面向消息中间件及JMS 以及 ActiveMQ例子

    为了帮助你理解ActiveMQ的意义,了解企业消息传送背景和历史是很重要的.讨论完企业消息传送,你将可以通过一个小例子了解JMS及其使用.这章的目的是简要回顾企业消息传送及JMS规范.如果你已经熟悉这 ...

  3. 消息中间件和JMS介绍(一)

    在一个公司创立初期,他可能只有几个应用,系统之间的关联也不是那么大,A系统调用B系统就直接调用B提供的API接口:后来这个公司做大了,他一步步发展有了几十个系统,这时候A系统要调用B系统的接口,但是B ...

  4. 消息队列入门(三)JMS标准及实现

    >>消息中间件 消息中间件即Message-oriented middleware(MOM),消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集 ...

  5. 消息中间件解决方案JMS

    1. JMS入门 1.1消息中间件 1.1.1品优购系统模块调用关系分析 我们现在讲品优购已经完成的功能模块梳理如下: 我们已经完成了5个web模块和4个服务模块.其中运营商后台的调用关系最多,用到了 ...

  6. 消息中间件--ActiveMQ&JMS消息服务

    ### 消息中间件 ### ---------- **消息中间件** 1. 消息中间件的概述 2. 消息中间件的应用场景 * 异步处理 * 应用解耦 * 流量削峰 * 消息通信   --------- ...

  7. JMS总结

    一 什么是JMS 1.JMS,Java Message Service,Java消息服务是一种可以实现异步通讯的消息中间件MOM(Message Oriented Middleware,面向消息的中间 ...

  8. JMS基本概念和模型

    ------------------------------------------------------------------------------------------- JMS是什么 J ...

  9. JMS学习(一)基本概念

    这两天面试了一两个公司,由于简历中的最近一个项目用到了JMS,然而面试官似乎对这个很感兴趣,所以都被问到了,但可惜的是,我除了说我们使用了JMS外,面对他们提出的一些关于JMS的问题,我回答得相当差, ...

随机推荐

  1. <停车位>version1.0

    <停车卫> 产品需求说明书 文档版本号: Version 1.0 文档编号: xxxx 文档密级: 归属部门/项目: 产品名: 停车卫 子系统名: 编写人: kina 编写日期: 2015 ...

  2. 匿名访问ReportService报表服务器(一)

    我的数据库版本是sql server 2008 r2,系统环境是windows server2008. 对于sql server 2008 r2上报rs报表的匿名访问问题,我这边尝试过两个可行方案: ...

  3. MySQLdb操作mysql的blob值

    一般情况下我们是把图片存储在文件系统中,而只在数据库中存储文件路径的,但是有时候也会有特殊的需求:把图片二进制存入数据库. 今天我们采用的是python+mysql的方式 MYSQL 是支持把图片存入 ...

  4. ppt 制作海报 导出高分辨率图片

    用ppt做海报,导出图片的时候,发现导出的图片的分辨率只有96ppi,清晰度不太好. 怎么能这样呢! 网上搜了一下,发现微软提供了一个修改注册表的方法,点击这里访问.不过那里讲的最新只有2010,我的 ...

  5. ubuntu linux mysql 安装 基本操作 命令

    mysql --help #如果有信息证明系统已经安装了mysql mysql -V #查看版本号 netstat -tap|grep mysql #检查mysql是否在启动状态 卸载mysql: s ...

  6. CentOS 6.5 x86_64系统手动释放内存

    1.查询当前内存使用情况和释放缓存的参数 redismaster 10:29:24 [~] [root] free -m total used free shared buffers cachedMe ...

  7. 大前端学习笔记整理【七】HTTP协议以及http与https的区别

    前言 还是老样子,新博客开始前总是想先啰嗦几句...HTTP协议其实在当初学习java时老师就有提过...但是...反正就那么过去了... 这段时间公司的项目正好要求做https的转换和迁移,然后自己 ...

  8. Tomcat如何配置环境变量

    1, JDK:版本为jdk-7-windows-i586.exe 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index ...

  9. svn 在linux 下的一些常用命令

    最近在Linux系统下玩一些svn的东西,感觉脑袋很乱, 于是整理了一下一些初学者必须弄明白的基本命令: 1. svn --version: 查看Linux系统下的svn client版本. Clie ...

  10. 为Page添加INotifyPropertyChanged功能

    在Page页面里面, DataContext 更新后,前台数据要求会自动更新. 但前台的绑定如果用x:bind 语法. 它要求强类型.直接关联到DataContext上就不行了. 需要为Page 添加 ...