交换文件(最大为GB)

时间:2019-03-17 10:51:44

标签: spring-boot apache-kafka rabbitmq

对于我的项目,我必须创建一个文件管理器,该文件管理器旨在存储许多文件(来自多个位置)并公开URL以下载它们。

在微服务生态系统(我曾经使用过Spring Boot)中,我想知道交换此类文件的最佳方法是什么,我的意思是将文件发送到文件管理器?

一方面,我一直认为最好以异步方式交换它们,因此HTTP似乎不是一个好选择。但是也许我错了。

将文件拆分成碎片(以减少每个部分的字节数)并通过RabbitMQ或Kafka之类的文件发送是个不错的选择吗?还是应该在NAS上或通过FTP传输整个文件,让文件管理器处理它们?或其他一些东西,例如将字节存储在临时数据库中(可能不是一个好选择)...

碎片化的问题是我必须实现一种逻辑,以保持每个碎片的排序,这使主题队列的处理变得复杂。

2 个答案:

答案 0 :(得分:2)

IMO,切勿通过消息代理发送实际文件。

首先,设置一些对象存储系统,例如S3(使用AWS或使用Ceph在本地),然后使用生产者将其路径作为字符串发送给文件,然后让消费者读取该路径并下载文件。

如果要从NAS或FTP收集文件,则Apache NiFi是一种具有与此类系统的连接器的工具。

答案 1 :(得分:1)

基于我在分布式系统(基于JMS)上的专业经验,在参与者之间传输大量内容:

  • 片段方法应用于请求-回复模型+控制信号(接下来是片段计数器)
  • 增量更新的方法。

为避免数据损坏,在两种情况下也可以传输和检查哈希函数结果。

但是如本e-mail thread中所述,一种更好的方法是在这种情况下使用FTP:

  

RabbitMQ实际上不应用于大文件传输或仅用于   小心翼翼地将文件分割成较小的单独部分   消息。

     

运行单个代理实例时,您仍然会很安全,但是在   群集设置,很大的消息会破坏群集。   群集节点通过1个tcp连接进行连接,该连接也必须   传输(erlang)心跳。如果您的大讯息需要更多时间   节点之间的传输比心跳超时(   如果正确,请大约20-45秒),群集将断开,您的   消息丢失。   通过amqp进行文件传输的首选架构是仅发送   带有可下载资源链接的消息,并让文件   可以通过专用协议(例如ftp:-)

处理

希望有帮助。