在 Java 中连接重置后恢复流式传输 GZIP 文件

Posted

技术标签:

【中文标题】在 Java 中连接重置后恢复流式传输 GZIP 文件【英文标题】:Resume streaming GZIP file after connection reset in Java 【发布时间】:2018-07-06 01:08:24 【问题描述】:

假设我的应用程序需要通过网络传输 100 GB+ GZIP 压缩文件。我假设由于连接问题,这些文件可能经常无法在一次尝试中流式传输。因此,我正在寻找能够从失败点恢复流的方法。我知道开箱即用的 GZIP 不允许从文件中间流式传输。但我认为它具有可以序列化的状态。然后拥有该状态,应该可以将 GZIP 阅读器恢复到故障前的状态并从故障点继续流式传输。

我将不胜感激有关如何实现这一目标的任何经验/想法。我查看了 GZIPInputStream 并最终面对 Inflater 类中的本机方法并阅读 RFC。

【问题讨论】:

本地压缩文件,然后使用 FTP 范围的 HTTP 发送。 我无法控制这些文件,我将它们作为 URL 获取。可以说我的应用程序不适用于大于 100GB 的文件,但理想情况下我更愿意将此限制推高。 【参考方案1】:

你如何解决一个大问题?把它们分成小块。这是我对此的初步看法,不了解文件类型、网络延迟、传输频率等方面的大量背景。

这就是我要做的。

    将该文件分解为非常小的块。为简单起见,每个 1GB。 以唯一且连续的方式重命名这些文件。示例 uuid-1、uuid-2 等 将此元数据保存在数据存储中。基本上你想跟踪你创建的所有小块。这是元数据的样子。

[
"file_name" : "b006194c-80ba-11e8-adc0-fa7ae01bbebc--1",
"size" : "1 GB",
"status" : "done"  
,

"file_name" : "dc903236-80ba-11e8-adc0-fa7ae01bbebc--2",
"size" : "1 GB",
"status" : "in_progress"  

]
    然后您开始在网络上移动这些块。只要您有带宽,您首先选择哪个或同时选择多个都没关系。 如果任何块失败,您可以重试该块而不必重做整个事情。 您将它们放在一起(您也有关于如何将它们放在一起的命令)。

祝你好运。

【讨论】:

我的应用程序只使用文件,我无法控制它们的生成。我将它们作为 URL 获取,因此要拆分它们,我需要首先下载它们。这就是最初的问题发生的地方。 哇哦。我不知道。但是,如果没有适当的机制来说明人们如何以编程方式检索它们,我就不会首先放置这么大的文件。我想说的是,例如,如果您要在亚马逊 S3 中存储 100 GB 的文件,我知道我将有一个 SDK 来部分检索它们。这是文档docs.aws.amazon.com/AmazonS3/latest/dev/…,它显示了如何做到这一点。如果您可以与存储它的人合作,看看您是否能找到更好的方法。

以上是关于在 Java 中连接重置后恢复流式传输 GZIP 文件的主要内容,如果未能解决你的问题,请参考以下文章

win10如何恢复网络设置

从 Heroku 流式传输大文件在 30 秒超时后失败

线程“主”java.net.SocketException 中的异常:连接重置 -

如何重置 JDBC 连接池

WCF HttpTransport:流式传输与缓冲传输模式

如何在 iOS 上通过安全连接流式传输视频