Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java消息中间件的概述与JMS规范

Java消息中间件的概述与JMS规范

作者头像
端碗吹水
发布于 2022-01-12 07:04:16
发布于 2022-01-12 07:04:16
6570
举报

为什么需要使用消息中间件

在介绍消息中间件之前,我们先来看一个故事:

老王的睡前故事:

在很久很久以前,小明隔壁有个姓王的邻居,姑且就叫隔壁老王吧。隔壁老王有个大女儿,名叫王兰花秀丽,秀丽从小就爱听老王讲睡前故事,每晚在入睡前都要老王讲了睡前故事才能睡的得着。但某一天秀丽到了外地去上大学,老王为了能给秀丽讲故事,只能通过打电话的方式进行,如下:

但是有时候可能由于秀丽的手机信号不好或者没电等情况,导致老王只能不停的联系,直到电话打通为止。老王内心:我能怎么办,我也很绝望啊。虽然秀丽可能会比较晚才能听到故事,但是这个过程问题也不大。直到某一天,老王的二女儿王兰花独秀也到了外地去上学,独秀也爱听老王讲睡前故事。老王没办法,只能也给独秀打电话。但是这样就会导致独秀等电话的时间需要等很久,因为老王得先给秀丽讲完再给独秀讲。有时候遇到信号不好的情况就更麻烦了,这样的话天天都需要耗到很晚,老王也感觉到身体好像被掏空:

经历了几个晚上后,老王想着天天这样子不行啊,搞得身体一天不如一天。于是作为老程序员的老王冥思苦想,想到了一个类似于消息中间件的办法,那就是注册一个微信公众号。老王只需要把每天的睡前故事放到这个公众号里,让两个女儿来订阅这个公众号就行了。那么两个女儿不仅能够不用等待谁先听完故事,老王也不用天天熬夜了,而且大家都觉得这个公众号讲的故事很好,于是来听老王讲故事的人越来越多,从此老王走上人生巅峰,真是可带劲了:

借助了微信公总号来讲故事后,老王不需要再去关心有多少人要听故事,老王只需要把故事放到公众号里。想听故事的人只需要有网络有微信来订阅这个公众号即可,这样不仅读者能随时随地听故事,而老王也不需要被讲故事的事情而耗费太多的时间。这个故事就是诠释了消息中间件为我们解决的一些问题。


我们再来举个栗子,例如我们现在有一个登录系统。我们实现的是通过短信验证码进行登录,所以在用户登录时登录系统需要去调用短信服务发送短信验证码给用户。除了短信服务外,还有一个积分服务,用于加载用户的积分信息。用户登录时还需要记录日志,这里就需要调用一个日志服务。随着系统的发展,登录时需要调用的服务可能越来越多。那么就意味着,用户进行一个简简单单的登录操作,就需要等待各种服务调用完成后才能登录上去,让登录的时间变得越来越长,万一有哪一个服务卡住了那么用户的登录也会卡住,所以登录系统和相关服务的耦合就很高,导致用户仅是进行登录时就得花费很多与登录功能本身不相关的时间。这就是通过服务调用让其他系统感知事件发生:

消息中间件就是用于解除这种耦合的,当用户发送登录请求并通过验证后,消息中间件就可以马上通知用户登录成功,而给其他服务投递消息的工作就由消息中间件去完成,也就是会进行一个异步处理,而用户是无感知的,不会拖慢用户的登录时间。通过消息中间件解耦服务调用:

消息中间件带来的好处:

  • 解耦系统
  • 异步通知
  • 横向扩展
  • 安全可靠
  • 顺序保证
  • ...

消息中间件概述

什么是中间件:

  • 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件。

什么是消息中间件:

  • 关注于数据的发送和接收,利用高效可靠的异步消息传递机制集成分布式系统

消息中间件流程图:

说到消息中间件不得不提一下JMS规范,什么是JMS规范:

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

同样的,涉及到消息中间件也需要对AMQP协议有一定的了解,什么是AMQP协议:

  • AMQP(advanced message queuing protocol)是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言条件的限制。

JMS和AMQP对比:

常见消息中间件对比:

名称

描述

特性

ActiveMQ

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

多种语言和协议编写客户端。语言:Java、C/C++、C#、Ruby、Perl、Python、PHP。应用协议:OpenWire、Stomp、REST、WS、Notification、XMPP、AMQP。完全支持JMS1.1和J2EE 1.4规范(持久化、XA消息、事务)。支持虚拟主题、组合目的以及镜像队列等

RabbitMQ

RabbitMQ是一个开源的AMQP实现,服务端用Erlang语言编写。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗

支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript。是AMQP模型的完整实现(vhost、Exchange、Binding、Routing Key 等)。支持事务及发布确认等特性,可对消息进行持久化

Kafka

Kafka是一种高吞吐量的分布式发布订阅消息系统,是一个分布式的、分区的、可靠的分布式日志存储服务。它通过一种独一无二的设计提供了一个消息系统的功能

通过O(1)复杂度的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。

综合评价:


JMS

JMS相关概念:

  • 提供者:实现JMS规范的消息中间件服务器
  • 客户端:发送或接收消息的应用程序
  • 生产者/发布者:创建发送消息的客户端
  • 消费者/订阅者:接收并处理消息的客户端
  • 消息:应用程序之间传递的数据内容
  • 消息模式:在客户端之间传递消息的方式,JMS中定义了主题和队列两种模式

JMS消息模式:

队列模式:

  • 客户端包括生产者和消费者
  • 队列中的消息只能被一个消费者消费
  • 消费者可以随时消费队列中的消息

队列模式示意图:

主题模式:

  • 客户端包括发布者和订阅者
  • 主题中的消息被所有订阅者消费
  • 消费者不能消费订阅之前就发送到主题中的消息

主题模式示意图:

JMS编码接口:

  • ConnectionFactory 连接工厂,用于创建连接到消息中间件的连接工厂对象
  • Connection 连接,代表了应用程序和服务器之间的通信链路
  • Destination 目的地,指定消息发布和接收的地点,包括队列或主题
  • Session 会话,表示一个单线程的上下文,用于发送和接收消息
  • MessageConsumer 消息消费者,由Session来创建,用于接收发送到目标的消息
  • MessageProducer 消息生产者,由Session来创建,用于发送消息到目标
  • Message 消息体,是在消费者和生产者之间传送的对象,一般由消息头 、 一组消息属性以及 一个消息体组成

JMS编码接口之间的关系:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/05/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
消息中间件之JMS实践(ActiveMQ)
JMS(Java Message Service):java平台中面向消息通信的API
烂猪皮
2018/08/03
6160
消息中间件之JMS实践(ActiveMQ)
Jms规范学习
1、什么是消息中间件?   关注于数据的发送和接受,利用高效可靠的异步消息传递机制集成分布式系统。
别先生
2019/10/08
8280
Jms规范学习
MQ消息中间件(工作+面试)
AMQP协议介绍 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 AMQP的主要特征是面向消息、
Java帮帮
2018/03/15
2.5K0
MQ消息中间件(工作+面试)
消息中间件知识点速查
消息中间件的必要性 传统的用法 如果每增加一个服务就要修改登陆系统里的调用的话,非常的麻烦而不具备扩展性 通过消息中间件解耦,新拓展的功能就只需要订阅登陆信息 好处 解耦 异步 横向扩展 安全可靠,持
linxinzhe
2018/04/10
7590
消息中间件知识点速查
常见消息中间件大 PK
说到消息中间件,估计大伙多多少少都能讲出来一些,ActiveMQ、RabbitMQ、RocketMQ、Kafka 等等各种以及 JMS、AMQP 等各种协议,然而这些消息中间件各自都有什么特点,我们在开发中又该选择哪种呢?今天松哥就来和小伙伴们梳理一下。
江南一点雨
2021/12/13
1K0
常见消息中间件大 PK
消息中间件哪些事
2.在客户端与服务器进行通讯时,客户端调用服务端接口后,必须等待服务端完成处理后返回结果给客户端才能继续执行,这种情况属于同步调用方式。
BUG弄潮儿
2020/06/29
1.1K0
企业级消息代理JMS和AMQP
  异步消息的主要目的是解决跨系统的通信。所谓异步消息,即消息发送者无需等待消息接收者的处理及返回,甚至无需关心消息是否发送与接收成功。在异步消息中有两个极其重要的概念,即消息代理和目的地。当消息发送者发送消息后,消息将由消息代理管理,消息代理保证消息传递到目的地。   异步消息的目的地主要有两种形式,即队列和主题。
别团等shy哥发育
2023/02/25
8730
企业级消息代理JMS和AMQP
看完这篇,还怕面试官问消息中间件么?
如果现有A、B两个应用程序,B应用希望从A应用获取到自己感兴趣的信息,A和B部署在不同的机房,可能还有C、D、E等更多的这样的应用程序需要A的这些消息,这就是我们常说的消息中间件的点对点、发布订阅模式。
代码宇宙
2023/02/15
6580
看完这篇,还怕面试官问消息中间件么?
从没有人能把MOM异步通信,消息中间件,消息队列?给一次性讲清
在微服务架构中,使用REST和RPC的方式最大的问题就是请求/响应模式的通信模式可能导致服务之间调用的可用性降低,客户端与服务端需要同时在线,双方都需要知道对方的URL地址,或者服务消费者需要通过某种发现机制来定位服务实例的地址。
愿天堂没有BUG
2022/10/28
6590
从没有人能把MOM异步通信,消息中间件,消息队列?给一次性讲清
浅谈消息队列及常见的分布式消息队列中间件
分布式消息队列中间件是是大型分布式系统不可缺少的中间件,通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息,或者在处理消息前不需要等待接收此消息。所以消息队列主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构。消息队列已经逐渐成为企业应用系统内部通信的核心手段,当前使用较多的消息队列有 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,而部分数据库如 Redis、MySQL 以及 PhxSQL 也可实现消息队列的功能。
BUG弄潮儿
2021/03/04
3.4K0
硬卷消息中间件系列(一):RabbitMQ 入门(核心概念与架构)
在这之前,我们相继卷完了:关系型数据库 MySQL 、 NoSQL 数据库 Redis 、 MongoDB 、搜索引擎 ElasticSearch 、大数据 Hadoop框架、PostgreSQL 数据库、消息中间件 Kafka、分布式协调中间件 Zookeeper 这些系列的知识体系。今天开始,我们将踏上另一个中间件学习之路:RabbitMQ!
民工哥
2023/09/09
1.8K0
硬卷消息中间件系列(一):RabbitMQ 入门(核心概念与架构)
IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?
在IM这种讲究高并发、高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转、消息削峰、消息交换异步化等等角色,当然MQ消息中间件的作用远不止于此,它的价值不仅仅存在于技术上,更重要的是改变了以往同步处理消息的思路(比如进行IM消息历史存储时,传统的信息系统作法可能是收到一条消息就马上同步存入数据库,这种作法在小并发量的情况下可以很好的工作,但互联网大并发环境下就是灾难)。
JackJiang
2018/08/29
2.1K0
五分钟入门消息中间件
众所周知,消息中间件是大型分布式系统中不可或缺的重要组件。它使用简单,却解决了不少难题,比如异步处理,系统耦合,流量削锋,分布式事务管理等。实现了一个高性能,高可用,高扩展的系统。本章通过介绍消息中间件的应用场景,消息中间件的传输模式,ActiveMQ快速入门 三个方面来对消息中间件进行入门介绍。还在等什么,赶快来学习吧!
Bug开发工程师
2018/07/23
1.6K0
五分钟入门消息中间件
原创 | 消息中间件的工作原理和RabbitMQ入门
消息(Message)是指应用于应用之间传送的数据,消息的类型包括文本字符串、JSON、XML、内嵌对象等等...
Bug开发工程师
2019/12/10
1.6K0
消息队列MQ/JMS/Kafka,你都了解吗?
是不是平常听到说消息队列啊,JMS啊,MQ啊 、kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都是什么吧。
芋道源码
2021/07/13
2K0
JMS中间件ActiveMQ详解
Java Message Service(JMS)是SUN提出的旨在统一各种MOM(Message-Oriented Middleware )系统接口的规范,它包含点对点(Point to Point,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。
烂猪皮
2018/08/03
1.6K0
JMS中间件ActiveMQ详解
消息中间件选型
常用的 MQ组件有 Kafka、RabbitMQ、RocketMQ、ActiveMQ、ZeroMQ、MetaMQ。当然 Kafka的功能更加强大,其它 MQ都有自己的特点和优势,如下:
Java架构师必看
2021/04/25
1.9K0
消息中间件选型
应对流量高峰的利器——消息中间件
周末和朋友一起自驾去海边玩,去过杨梅坑的应该都知道,从杨梅坑到鹿嘴山庄需要坐快艇过去。
xin猿意码
2023/10/18
3090
应对流量高峰的利器——消息中间件
消息中间件RabbitMQ
如某个系统会往数据库写数据,但是数据库只能支撑每秒1000左右的并发写入,并发量再高就容易宕机。
张小驰出没
2021/12/06
5250
消息中间件RabbitMQ
消息队列中间件(一)介绍
消息队列中间件是大型系统中的重要组件,已经逐渐成为企业系统内部通信的核心手段。它具有松耦合、异步消息、流量削峰、可靠投递、广播、流量控制、最终一致性等一系列功能,已经成为异步RPC的主要手段之一。 目前常见的消息中间件有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。
未读代码
2019/11/04
6140
消息队列中间件(一)介绍
相关推荐
消息中间件之JMS实践(ActiveMQ)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文