`

ActiveMQ传输文件的几种方式原理与优劣

阅读更多
本文讨论ActiveMQ传输文件的几种方法的原理及其利弊,作为消息发送、直接传输文件、使用ftp或http中转。最后介绍扩展ActiveMQ实现自定义文件传输方式,讨论如何实现高效的文件传输。by kimmking

作为消息发送

按照JMS规范,为了保证可靠性,所有的消息都应该是发送到broker,然后交由broker来投递的。也即是说其实JMS是不建议或不支持传输文件的。

对于比较小的文件,简单的处理方式是先读取所有的文件成byte[],然后使用ByteMessage,把文件数据发送到broker,像正常的message一样处理。对于大文件,例如1GB以上的文件,这么搞直接把client或是broker给oom掉了。

这种方式仅仅适用于小文件的传输。特别是如果broker端使用数据库作为存储,message序列化以后存放于blob字段,文件传输频繁或是稍微有点大,写入效率极低。

直接传输文件

为了解决传输大文件的问题,ActiveMQ在jms规范之外引入了jms streams的概念。PTP模式下,连到同一个destination的两端,可以通过broker中转来传输大文件。

发送端使用connection.createOutputStream打开一个输出流,往流里写文件。

OutputStream out =connection.createOutputStream(destination);

接收端则简单的使用connection.createInputStream拿到一个输入流,从中读取文件数据即可。
InputStream in = connection.createInputStream(destination)

详见:http://activemq.apache.org/jms-streams.html

使用非常简单。ActiveMQ在中间做了什么事情呢?

其实过程蛮曲折的,发送端拿到文件后,首先分片,默认64K文件数据为一个byte message,然后依次把所有的message发送到broker,broker转发给接收端,最后发送一个空消息作为结束符。






connection上提供了两个创建OutputStream的方法,一个是createOutputStream创建的是持久化的消息集合,这些数据会写到磁盘或是数据库(对大文件来说慢消费也是一件可怕的事儿);一个是createNonPersistOutputStream创建的是非持久化消息集合,不会写到磁盘上,如果没有及时消费掉就惨了。

文件片段的byte message的TTL设置为0,就是不会超时进入DLQ。

优势:简单直接,处理非常小(不大于64K)的文件非常方便。

劣势:对大文件,简直就是噩梦。

文件中转方式

使用消息的方式来传递大文件,明显不是一个有效率的办法。文件应该就是按文件的方式去处理。

自己处理中转

如果自己处理文件的话,一个简单方式是使用共享或ftp、dfs等方式,先把文件发送到一个大家都可以拿到的地方,然后发送message,payload或properties中包含文件的路径信息。这样,consumer拿到文件路径后去指定的地方,按照给定的方式去获取文件数据即可。

优势:这种方式可以用来处理大数据,并且不需要client或broker在内存中持有文件数据本身,非常的节省资源。而且文件是通过额外的方式处理,跟ActiveMQ本身无关,所以符合jms协议、处理的效率也相对比较高。

劣势:需要自己处理很多文件相关的操作。

BlobMessage对文件中转的封装

幸运的是,ActiveMQ把上面繁复的文件处理工作进行了封装,屏蔽掉文件中转的整个处理过程,使得我们可以使用类似jms规范的API来简单操作文件传输。

举个例子来说,典型的使用步骤:

发送端:

1.        启动ActiveMQ时,也启动jetty(即activemq.xml中有import jetty.xml),此时jetty中运行了一个ActiveMQ自带的http文件服务器

2.        使用tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8161/fileserver/创建connection,然后创建session和producer

3.        使用如下代码发送文件:

BlobMessageblobMessage = session.createBlobMessage(file);

blobMessage.setStringProperty("FILE.NAME",file.getName()); 

blobMessage.setLongProperty("FILE.SIZE",file.length()); 

producer.send(blobMessage); 

接收端比较简单,正常的使用jms接收到消息:

InputStream inputStream = blobMessage.getInputStream();

然后直接读取文件数据即可。文件名和文件大小可以从message的属性中拿到。



这个过程中ActiveMQ做了什么呢?

发送端:producer.send的时候,把文件通过http协议的PUT方法发到jetty中的fileserver(默认128K走http的chunk分片传输)。然后把http的url写入消息中。再把消息发送到broker。

接收端:接收到消息以后,发现是BlobMessage,拿到url,直接使用GET方法获取文件数据。处理完毕后,使用DELETE方法从fileserver删除文件。






BlobMessage支持3种文件中转方式:

FILE

         要求client和broker在同一个机器或者使用同一个共享存储。发送文件的时候,把文件从本地写入到指定路径。接收文件的时候,把文件从此路径读出来。

HTTP

         使用http的fileserver,PUT/GET/DELETE方法。ActiveMQ自带了简单的实现。就是前面场景中使用的方式。

FTP

         使用一个独立的ftpserver作为文件中转方式。发送文件的时候,把文件发送到ftp服务器。接收文件的时候,从ftp把文件读取下来。



详见:http://activemq.apache.org/blob-messages.html



优势:消息处理与文件处理传输分开,极大的提高了文件传输的效率。而且可以使用类似jms协议的方式来处理文件发送。

劣势:FILE方式不太实用。HTTP和FTP方式都需要额外的fileserver。



自定义文件传输方式

ActiveMQ实现BlobMessage的三种文件中转方式时,使用了Façade和Strategy模式。ActiveMQBlobMessage需要在发送消息时使用blobUploader上传文件、接收消息时使用blobDownloader下载文件。每种中转方式的这两个操作分别使用BlobUploadStrategy和BlobDownloadStrategy封装。

所以,我们也可以根据ActiveMQBlobMessage文件传送的原理,实现自己的定制方式:

1、  给ActiveMQBlobMessage添加自己的blobDownloader和blobUploader来实现文件的处理。

2、  扩展这个文件中转机制,实现BlobUploadStrategy和BlobDownloadStrategy。



一个更高效且不需要额外fileserver的实现思路是:broker上再打开一个tcp的监听端口,用来接收和转发文件,当发送和接收端都在时,broker仅仅作为一个传输代理。接收端不在时,broker把数据存为本地临时文件,处理完毕后删除掉。之所以使用一个新的端口来传输文件数据而不是已有的transport,是为了避免jms streams这种命令和数据混合的模式。可以参考ftp协议,作为一种高效的文件传输协议,它有一个很大的特点就是命令的处理,和数据传输的处理使用不同的端口和连接。而ActiveMQ使用的openwire协议其实就是一个个的操作命令。文件分片、包装、序列化,到另一头再反向这个过程,无疑是效率很低下的。

大家有什么想法都可以跟我交流:kimmking@163.com
  • 大小: 96.4 KB
  • 大小: 66.9 KB
分享到:
评论

相关推荐

    liuwei1989#study-guide#ActiveMQ传输文件的几种方式原理1

    对于比较小的文件,简单的处理方式是先读取所有的文件成byte[],然后使用ByteMessage,把文件数据发送到broker,像正常的message一样处理。

    JMS 使用 ActiveMQ 传送文件

    尽管描述中并未给出具体信息,但我们可以推断这篇博文可能详细介绍了如何使用JMS与ActiveMQ结合来实现文件传输。博主可能讨论了如何配置ActiveMQ服务器,以及如何通过JMS API创建消息,将文件内容封装到消息中,然后...

    ActiveMQ 配置文件详解

    网络连接与传输配置 在`<transportConnectors>`标签下,你可以配置ActiveMQ如何监听和连接到其他节点。例如,你可以设置TCP端口、是否启用SSL以及连接超时时间: ```xml ``` ### 2. 消息存储 ActiveMQ支持...

    activeMQ在文件上传的应用

    在文件上传应用中,ActiveMQ可以作为数据传输的桥梁,实现文件的异步传输,提高系统的性能和可扩展性。 在描述中提到的"activeMQ与uploadify整合",是指将ActiveMQ与Uploadify插件结合使用,以实现高效、流畅的文件...

    activeMQ三种收发消息方式

    在这个小例子中,我们将探讨ActiveMQ的三种主要的消息收发方式:点对点、发布/订阅和事务处理模式。 1. **点对点(Point-to-Point)模式**: 在点对点模式下,消息从一个生产者发送到一个队列,然后由一个或多个...

    activemq 接收文件流 C#

    总的来说,C#与ActiveMQ的集成为高效地处理文件流提供了一种强大且灵活的方式。通过理解ActiveMQ的工作原理,正确配置环境,并使用NMS库,开发者可以轻松地实现在分布式系统中传输和接收文件流。

    activeMQ JMS 3种创建方式

    在ActiveMQ中,有三种主要的方式来创建消息队列(QUEUE)和主题(TOPIC),这些方式使得开发者可以根据具体需求灵活选择。 一、基于Java API的方式 ActiveMQ提供了丰富的Java API,可以直接在代码中创建和管理消息...

    Activemq原理文档

    Activemq原理文档 Activemq是Apache出品的开源消息总线,完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现。 Activemq是当今J2EE应用中的重要组件之一,因其强劲的消息队列处理能力和高性能的消息传输机制而广受...

    activemq ajax方式demo

    在本示例中,"activemq ajax方式demo"是一个使用Ajax技术与ActiveMQ进行交互的简单应用演示,主要目的是解决在Web通信过程中可能出现的中文乱码问题。让我们详细了解一下这个知识点。 首先,ActiveMQ是Apache软件...

    ActiveMQ5.13 安装与配置

    "ActiveMQ5.13 安装与配置" ActiveMQ 是 Apache 软件基金会提供的一个开源message broker,能够实现点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)模式的消息传递。ActiveMQ 5.13 是 ActiveMQ 的一个...

    ActiveMQ使用SSL加密文件Demo

    **ActiveMQ 使用 SSL 加密文件 Demo** ActiveMQ 是一个开源的消息代理服务器,它遵循 Java Message Service(JMS)规范,提供了可靠的消息传递功能。在实际的生产环境中,为了确保消息传输的安全性,我们通常会使用...

    activemq的几种基本通信方式总结

    在前面一篇文章里讨论过几种应用系统集成的方式,发现实际上面向消息队列的集成方案算是一个总体比较合理的选择。这里,我们先针对具体的一个消息队列Activemq的基本通信方式进行探讨。activemq是JMS消息通信规范的...

    ActiveMQ路由配置方式

    ActiveMQ路由配置是Apache ActiveMQ项目中的一种重要配置方式,它依赖另一个Apache项目Camel。ActiveMQ集成了Camel,启动时同时会启动Camel。通过Camel Web Console可以进行Routing配置。 使用Camel Choice进行配置...

    jmx监控activeMQ监控

    jmx监控ActiveMQ监控 jmx(Java Management Extensions)是一种Java技术,为Java...jmx监控ActiveMQ监控是一种非常有用的监控方式,可以帮助开发者和运维人员实时监控ActiveMQ的运行状态,提高系统的可靠性和稳定性。

    ActiveMQ的安装与使用

    ActiveMQ是一种基于JMS的开源消息代理,广泛应用于企业消息传递解决方案中。它支持多种消息协议,并具有跨平台兼容性、高可用性和集群支持等特点。接下来我们将详细阐述ActiveMQ的安装与使用过程,包括安装前提条件...

    activemq与tomcat整合

    ActiveMQ是Apache软件基金会开发的一款开源JMS(Java Message Service)消息代理,它提供了一种高效、灵活、可靠的方式来传递消息。Tomcat则是一款流行的Java Servlet和JavaServer Pages容器,常被用作轻量级Web...

    activemq 配置说明与activemq入门讲解

    3. **存储策略**:ActiveMQ支持两种存储方式——内存存储和文件存储(默认是KahaDB)。内存存储速度快但不持久,文件存储持久但相对较慢。可以通过配置`<persistenceAdapter>`元素来切换。 4. **网络连接**:...

    activeMQ-cpp 测试文件

    在安装ActiveMQ时,你需要下载并配置ActiveMQ服务器,通常这包括以下几个步骤: 1. 下载ActiveMQ的最新稳定版本,通常是.tgz或.zip格式的压缩包。 2. 解压下载的文件到你选择的目录。 3. 配置ActiveMQ的配置文件(如...

    spring activeMQ-demo 配置

    Spring框架提供了一套完整的JMS(Java Message Service)支持,可以方便地与各种消息队列进行整合,ActiveMQ作为JMS的实现,能够帮助我们构建高可靠、高性能的消息系统。 **一、环境准备** 1. **安装ActiveMQ**: ...

Global site tag (gtag.js) - Google Analytics