NodeJS API 通过 SFTP 同步上传的文件

NodeJS API sync uploaded files through SFTP

我有一个 NodeJS REST API,它具有供用户上传资产(主要是图像)的端点。我通过 CDN 分发我的资产。我现在的做法是使用多部分形式调用我的端点 /assets/upload,API 为资产创建数据库资源,然后使用 SFTP 将图像传输到 CDN 来源。成功后,我用上传资产的 url 响应。

我注意到对于相对较小的文件,最昂贵的操作是通过 SFTP 连接到源。

所以我的第一个问题是:

1.始终保持连接活跃是不是一个坏主意,这样我就可以 总是重复使用它来同步我的文件。

我的第二个问题是:

2。让我的 API 处理 SFTP 传输到 CDN 来源是不是一个坏主意,我是否应该考虑拥有一个可以处理 HTTP 请求本身的 CDN 来源?

简短回答:(1) 使连接保持活动状态是个不错的主意,但它会带来并发症。我建议先尝试不重用连接。并且 (2) 上传应该通过 API,但也许有一些方法可以优化 API 到 CDN 传输的发生方式。

长答案:

1.始终保持连接活动以便我始终可以重复使用它来同步我的文件是不是一个坏主意。

保持连接活动通常不是一个坏主意。一般来说,重用连接可以提高站点性能。

然而,它确实带来了一些并发症。您需要确保连接已建立。您需要确保如果连接断开,您会重新创建它。在某些情况下,SFTP 客户端认为连接仍然有效,但实际上不是,您需要重试。您还需要确保当一个请求正在使用连接时,没有其他请求可以这样做。您可能希望使用一个连接池,以便您可以同时处理多个请求。

如果幸运的话,SFTP 客户端库已经处理了这个问题(看看它是否支持连接池)。如果你不是,你将不得不自己做。

我的建议 - 尝试在不首先重新使用连接的情况下执行此操作,然后查看站点的性能是否可以接受。如果不是,则考虑重用连接。不过要小心。

2。让我的 API 处理 SFTP 传输到 CDN 来源是不是一个坏主意,我是否应该考虑拥有一个可以处理 HTTP 请求本身的 CDN 来源?

通常让 HTTP 请求通过 API 是个好主意,原因如下:

  • 出于安全原因,您希望将 CDN 上传凭据存储在您的 API 上,而不是存储在您的客户端(网站或移动应用程序)上。您应该假设可以看到您的网站代码(通过查看源代码)并且人们通常可以反编译或反向工程移动应用程序,并且他们将能够在代码中看到您的凭据。
  • 这对客户端隐藏了实现细节,因此您可以在将来更改它而无需更改客户端代码。

@tarun-lalwani 的建议实际上是一个很好的建议——使用S3 存储图像,并使用lambda 触发器将其上传到CDN。有几个 Node.js 库允许您通过 API 的 http 请求将图像直接流式传输到 S3 存储桶。这意味着您不必担心计算机实例上的磁盘 space。 关于你对@tarun-lalwani 的评论提出的问题 - 一种方法是使用 S3 图像 url 路径,直到 lambda 函数完成。 S3 也可以提供图像,如果适当地授予这样做的权限。然后在lambda函数完成上传到CDN后,你只需替换你数据库中的图片路径即可。