交换文件(最多许多GB)

问题描述 投票:1回答:2

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

在微服务生态系统中(我习惯使用spring boot),我想知道交换这些文件的最佳方式是什么,我的意思是将文件发送给文件管理器?

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

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

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

spring-boot apache-kafka rabbitmq
2个回答
2
投票

IMO,永远不会通过消息代理发送实际文件。

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

如果您想从NAS或FTP收集文件,那么Apache NiFi就是一个具有这种系统连接器的工具。


1
投票

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

  • 片段方法应该用于请求 - 回复模型+控制信号(下一个,片段计数器)
  • delta更新方法。

为了避免损坏数据,还可以在两种情况下传输和检查散列函数结果。

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

RabbitMQ实际上不应该用于大文件传输,或者只是非常小心地将文件分割成较小的单独消息。

运行单个代理实例时,您仍然是安全的,但在群集设置中,非常大的消息将破坏群集。群集节点通过1 tcp连接进行连接,该连接还必须传输(erlang)心跳。如果您的大消息在节点之间传输的时间超过心跳超时(如果我是正确的话,大约在20-45秒之间),群集将中断并且您的消息将丢失。通过amqp进行文件传输的首选体系结构是发送带有可下载资源链接的消息,并通过ftp等专用协议处理文件传输:-)

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.