JMS与MQ之间的关系

一、JMS

1、基本概念

JavaEE8官方文档在Chapter 48给出的概念如下

The Java Message Service (JMS) API is a messaging standard that allows application components based on the Java Platform Enterprise Edition(Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.

也就是说

JAVA消息服务API是一个消息服务的规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使松散耦合、可靠以及异步的分布式通信成为可能。

JMS是Java平台中关与面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。与JDBC类似JMS与具体平台无关,很多消息中间件提供商都对JMS都提供支持,比如Apache的ActiveMQ,IBM 的 MQSeries。

2、消息模式

在JMS API出现之前,大部分产品使用点对点(point-to-point)或发布/订阅(publish/subscribe)中的任一方式来进行消息通讯。JMS定义了这两种消息发送模型的规范,它们相互独立。任何JMS的提供者可以实现其中的一种或两种模型,这是它们自己的选择。JMS规范提供了通用接口保证我们基于JMS API编写的程序适用于任何一种模型。

2.1、点对点消息模式(Point-to-Point Messaging Style)

在点对点通信模式中,应用程序由消息队列,发送方,接收方组成。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。
点对点模型遵循以下特点,如下图所示

  • 一个消息只能被一个消费者接受
  • 不管生产者是否在发送消息,消费者都可以从消息队列中取到消息

在这里插入图片描述

2.2、发布/订阅消息模式(Publish/Subscribe Messaging Style)

在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端。该模式下,发布者与订阅者都是匿名的,即发布者与订阅者都不知道对方是谁。并且可以动态的发布与订阅Topic。Topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。
发布/订阅模型遵循以下特点,如下图所示

  • 每个消息可以传递个多个消费者
  • 生产者发送到topic的消息,只有订阅了topic的订阅者才会收到消息,而且为了消费消息,消费者必须保持运行的状态。
    为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

在这里插入图片描述

二、MQ

1、基本概念

什么是消息队列MQ(Message Queue)?

  • 消息(Message):传输的数据。
  • 队列(Queue):队列是一种先进先出的数据结构。
  • 消息队列从字面的含义来看就是:一个存放消息的容器。

消息队列可以简单理解为:把要传输的数据放在队列中,是一种应用程序之间的通信方法。

MQ这样的提法更像是一种概念,而MQ的产品是我们比较熟知的,也就是我们常说的消息中间件。常见的消息中间有:RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等,而部分数据库如Redis、MySQL以及phxsql也可实现消息队列的功能。

2、消息中间件的组成
  • Broker
    消息服务器,作为server提供消息核心服务
  • Producer
    消息生产者,业务的发起方,负责生产消息传输给broker,
  • Consumer
    消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
  • Topic
    主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的 广播
  • Queue
    队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
  • Message
    消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
3、消息中间件的消息模式

消息中间件对点对点和消费/订阅模式都支持。

三、JMS和MQ之间的关系

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值