消息中间件之JMS概念理解篇(一)

来源:互联网 发布:centos 6.7安装mysql 编辑:程序博客网 时间:2024/05/17 01:39

1 背景 & JMS概述

      当前,CORBA、DCOM、RMI等RPC中间件技术己广泛应用于各个领域。但是面对規模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性:

(1) 同步信:客户发出调用后,必须等待服务对象完成处理并回结果后才能续执行;

(2) 客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程都必须正常运行;如果由于服务对象崩溃或者网故障导致客户的请求不可达,客户会接收到异常;

(3) 点对点通信:客户的一次调用只发送给某个单独的目标对象。

      面向消息的中间件(Message Oriented Middleware,MOM)较好的解决了以上问题。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中。在合适的时候再将消息转发给接收者。这种模式下,发送和接收是异步的,发送者无需等待:二者的生命周期未必相同:发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信:对于一个消息可以有多个接收者。

      JAVA消息服务(JMS)定义了Java中访问消息中间件的接口。JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称为JMS Provider,己有的MOM系统包括Apache的ActiveMQ、以及阿里巴巴的RocketMQ、IBM的MQSeries、Microsoft 的MSMQ和BEA的MessageQ、RabbitMQ等等,它们基本都遵循JMS规范。

后面我会陆续的写关于Apache的ActiveMQ跟阿里巴巴的RocketMQ(开源版)的文章。

2 对象模型

      JMS对象模型包含如下几个要素:

(1)连接工厂。连接工厂(ConnectionFactory)是由管理员创建,并绑定到JNDI树中。客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。

(2)JMS连接。JMS连接(Connection)表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。

(3)JMS会话。JMS会话(Session)表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。

(4)JMS目的。JMS目的(Destination),又称为消息队列,是实际的消息源。

(5)JMS生产者和消费者。生产者(Message Producer)和消费者(Message Consumer)对象由Session对象创建,用于发送和接收消息。

(6)JMS消息通常有两种类型:

① 点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。

② 发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。

如图(图片来源于百度百科):

这里写图片描述

3 模型

      Java消息服务应用程序结构支持两种模型:

      点对点或队列模型(Point-to-Point)

      发布者/订阅者模型(Publish/Subscribe)

Point-to-Point(P2P)

      在P2P模型中,有下列概念:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。

特点:

(1)每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)

(2)发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列

(3)接收者在成功接收消息之后需向队列应答成功

建议:如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模型。

Publish/Subscribe(Pub/Sub)

      在Pub/Sub模型中,有下列概念: 主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

特点:

(1)每个消息可以有多个消费者

(2)发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。

(3)为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

建议:如果你希望发送的消息可以不被做任何处理、或者被一个消费者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型。

4 术语概念

ConnectionFactory 接口(连接工厂)

      用户用来创建到JMS提供者的连接的被管对象。JMS客户通过可移植的接口访问连接,这样当下层的实现改变时,代码不需要进行修改。管理员在JNDI名字空间中配置连接工厂,这样,JMS客户才能够查找到它们。根据消息类型的不同,用户将使用队列连接工厂,或者主题连接工厂。

Connection 接口(连接)

      连接代表了应用程序和消息服务器之间的通信链路。在获得了连接工厂后,就可以创建一个与JMS提供者的连接。根据不同的连接类型,连接允许用户创建会话,以发送和接收队列和主题到目标。

Destination 接口(目标)

      目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题。JMS管理员创建这些对象,然后用户通过JNDI发现它们。和连接工厂一样,管理员可以创建两种类型的目标,点对点模型的队列,以及发布者/订阅者模型的主题。

Session 接口(会话)

      表示一个单线程的上下文,用于发送和接收消息。由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收的。会话的好处是它支持事务。如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息。在提交事务之前,用户可以使用回滚操作取消这些消息。一个会话允许用户创建消息,生产者来发送消息,消费者来接收消息。

MessageConsumer 接口(消息消费者)

      由会话创建的对象,用于接收发送到目标的消息。消费者可以同步地(阻塞模式),或(非阻塞)接收队列和主题类型的消息。

MessageProducer 接口(消息生产者)

      由会话创建的对象,用于发送消息到目标。用户可以创建某个目标的发送者,也可以创建一个通用的发送者,在发送消息时指定目标。

Message 接口(消息)

      是在消费者和生产者之间传送的对象,也就是说从一个应用程序传送到另一个应用程序。一个消息有三个主要部分:

      消息头(必须):包含用于识别和为消息寻找路由的操作设置。

      一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。

      一个消息体(可选):允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息)。

      消息接口非常灵活,并提供了许多方式来定制消息的内容。

消息格式定义

      JMS定义了五种不同的消息正文格式,以及调用的消息类型。允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。

StreamMessage Java原始值的数据流

MapMessage一套名称值对

TextMessage一个字符串对象

ObjectMessage一个序列化的Java对象

BytesMessage一个未解释字节的数据流

好!JMS大概介绍到这,后面我会陆续的写关于Apache的ActiveMQ跟阿里巴巴的RocketMQ(开源版)的文章。