如何检查一个大的 CDN 文件是否更新而不在存储库中存储相同的文件并且没有数据库?

How to check if a big CDN file is updated without storing the same file within the repository and without database?

我有一个大文件要解析存储在 CDN 上。 每次我启动我的程序时,都会检查以控制 CDN 文件是否已更新。如果是这样,我需要检索此 CDN 文件中包含的更新信息。

目前的解决方案是在存储库中也有一个 CDN 文件的副本,并通过少量操作检查是否有更改:

are_different_current_and_remote()
{
    diff <(curl -s "") "" > /dev/null
    if [ $? != 0 ]; then
        return 0
    else
        return 1
    fi
}

我发现这个过程效率不高,但我想知道哪种方法最好。

我想到了第二种方法。

我也不是这个解决方案的忠实粉丝,但我认为这是一个改进,因为存储库中 space 更少。

您有更好的方法吗? 非常感谢。

获取校验和并与本地计算的版本进行比较将是最好的解决方案。在您使用 curl -s 的示例中,您仍然需要下载整个文件,然后在本地计算校验和。

我建议每次更新 CDN 中的文件并以某种方式将其与文件一起存储在 CDN 中时计算校验和。一些 CDN 提供商已经为您做到了。取决于您的 CDN 提供商的智能程度(一些示例):

  • 将 SHA 校验和存储在额外的单独文件中,该文件逐渐变得比资产本身更小且下载速度更快(所以你会这样做 curl -s https://cdn/remotefile.sha1

  • 一些 CDN 提供商在每次上传文件时计算校验和,然后将其作为自定义 X-Checksum-Sha1 header 公开以响应 HTTP HEAD 请求(再次快速因为它不检索文件内容)。

  • 一些 CDN 提供商有单独的 REST API,允许存储和检索有关文件的元数据,您可以利用它来存储校验和、上次更新日期、版本标签或其他内容。

如果完整性检查是强制性的并且在使用软件之前是必要的,我建议在客户端也做类似的缓存,每次你获取新文件时计算校验和并存储它(例如在文件,注册表中......)所以启动是在不需要文件更新的情况下快速。