Active MQ(一)--消息队列基本概念介绍

来源:互联网 发布:软件出厂测试大纲 编辑:程序博客网 时间:2024/06/06 23:19

1.概要

本系列将介绍Active MQ 的原理以及实现,在学习之前,先了解一些基本概念。

1.1.什么是消息队列

消息队列(Message queue)是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。—百度百科

1.2.MQ的通讯模式

1) 点对点通讯:点对点方式是最为传统和常见的通讯方式,它支持一对一、一对多、多对多、多对一等多种配置方式,支持树状、网状等多种拓扑结构。

2) 多点广播:MQ适用于不同类型的应用。其中重要的,也是正在发展中的是”多点广播”应用,即能够将消息发送到多个目标站点(Destination List)。可以使用一条MQ指令将单一消息发送到多个目标站点,并确保为每一站点可靠地提供信息。MQ不仅提供了多点广播的功能,而且还拥有智能消息分发功能,在将一条消息发送到同一系统上的多个用户时,MQ将消息的一个复制版本和该系统上接收者的名单发送到目标MQ系统。目标MQ系统在本地复制这些消息,并将它们发送到名单上的队列,从而尽可能减少网络的传输量。

3) 发布/订阅(Publish/Subscribe)模式:发布/订阅功能使消息的分发可以突破目的队列地理指向的限制,使消息按照特定的主题甚至内容进行分发,用户或应用程序可以根据主题或内容接收到所需要的消息。发布/订阅功能使得发送者和接收者之间的耦合关系变得更为松散,发送者不必关心接收者的目的地址,而接收者也不必关心消息的发送地址,而只是根据消息的主题进行消息的收发。在MQ家族产品中,MQ Event Broker是专门用于使用发布/订阅技术进行数据通讯的产品,它支持基于队列和直接基于TCP/IP两种方式的发布和订阅。

4) 群集(Cluster):为了简化点对点通讯模式中的系统配置,MQ提供Cluster(群集)的解决方案。群集类似于一个域(Domain),群集内部的队列管理器之间通讯时,不需要两两之间建立消息通道,而是采用群集(Cluster)通道与其它成员通讯,从而大大简化了系统配置。此外,群集中的队列管理器之间能够自动进行负载均衡,当某一队列管理器出现故障时,其它队列管理器可以接管它的工作,从而大大提高系统的高可靠性。

1.3.消息中间件有很多的用途和优点

  1. 将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块;
  2. 负责建立网络通信的通道,进行数据的可靠传送。
  3. 保证数据不重发,不丢失
  4. 能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务

1.4.java中的消息服务

消息队列的实现原理以及规范大都类似,下面介绍下jms的规范。

JMS,它是J2EE的13个规范之一,提供的是消息中间件的规范。
JMS包括以下基本构件:
   连接工厂,是客户用来创建连接的对象,ActiveMQ提供的是ActiveMQConnectionFactory;
   连接connection;
   会话session,是发送和接收消息的上下文,用于创建消息生产者,消息消费者,相比rocketMQ会话session是提供事务性的;
   目的地destination,指定生产消息的目的地和消费消息的来源对象;
   生产者、消费者,由会话创建的对象,顾名思义。

  消息通信机制
   点对点模式,每个消息只有1个消费者,它的目的地称为queue队列;
   发布/订阅模式,每个消息可以有多个消费者,而且订阅一个主题的消费者,只能消费自它订阅之后发布的消息。

  消息确认机制
   Session.AUTO_ACKNOWLEDGE,直接使用receive方法。
   Session.CLIENT_ACKNOWLEDGE,通过消息的acknowledge 方法确认消息。
   Session.DUPS_ACKNOWLEDGE,该选择只是会话迟钝第确认消息的提交。如果JMS provider 失败,那么可能会导致一些重复的消息。如果是重复的消息,那么JMS provider 必须把消息头的JMSRedelivered 字段设置为true。
   
  JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。

  · StreamMessage – Java原始值的数据流

  · MapMessage–一套名称-值对

  · TextMessage–一个字符串对象

  · ObjectMessage–一个序列化的 Java对象

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

1.5.消息队列对比

目前有很多的消息队列,下面是对比图
这里写图片描述

原创粉丝点击