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

4

我有一个 NodeJS REST API,其中包含让用户上传资产(主要是图像)的端点。我通过 CDN 分发我的资产。目前我的做法是使用多部分表单调用我的端点 /assets/upload,API 创建资产的数据库资源,然后使用 SFTP 将图像传输到 CDN 源。成功后,我会返回已上传资产的 URL。

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

所以我的第一个问题是:

1. 始终保持连接以便可以始终重用它来同步我的文件是一个不好的想法吗?

我的第二个问题是:

2. 让我的 API 处理与 CDN 源之间的 SFTP 传输是否是不好的想法?我是否应该考虑让 CDN 源自己处理 HTTP 请求?


你是使用亚马逊 AWS 还是普通服务器? - Tarun Lalwani
亚马逊AWS与CDN77 - Malo Guertin
你应该让上传操作发生在S3上,并在数据库中存储关于键/路径的信息。然后配置一个自动Lambda调用,该调用将文件上传到CDN源。 - Tarun Lalwani
你如何处理资产的URL?最终它将变成类似于cdnurl.com/xx/assetname的形式,但在Lambda调用上传到源之前,该资产将不可用。 - Malo Guertin
1个回答

2
简短回答:(1)保持连接活跃不是个坏主意,但会带来一些麻烦。建议先尝试不重用连接。 (2)上传应该通过API进行,但可能有优化API到CDN传输的方法。
长回答:
1. 总体来说,保持连接活跃并不是个坏主意。就性能而言,重用连接可以提高网站性能。
然而,这会带来一些麻烦。你需要确保连接处于打开状态,如果连接断开需要重新创建连接。有时SFTP客户端可能会认为连接仍然有效,但实际上并非如此,需要重试。另外,当一个请求正在使用连接时,其他请求不能使用该连接。你可能需要维护一个连接池,以便同时处理多个请求。
如果你幸运的话,SFTP客户端库已经处理了这个问题(查看是否支持连接池)。如果没有,你就需要自己动手解决。
我的建议是:先尝试不重用连接,看看网站的性能是否可接受。如果性能不佳,则考虑重用连接。但要小心。
2. 通常情况下,让HTTP请求通过API更好,原因如下:
- 出于安全考虑,你希望将CDN上传凭据存储在API上,而不是在客户端(网站或移动应用程序)上。你应该假设网站的代码可以被看到(通过查看源代码),人们一般可以反编译或逆向工程移动应用程序,他们将能够在代码中看到你的凭据。 - 这样可以隐藏实现细节,因此在未来更改时,不需要更改客户端代码。
@tarun-lalwani的建议实际上是个好主意——使用S3存储图像,并使用lambda触发器将其上传到CDN。有一些Node.js库可以允许你通过API的HTTP请求将图像直接流式传输到S3存储桶中。这意味着你不必担心机器实例上的磁盘空间问题。
关于你对@tarun-lalwani评论的问题,一种方法是使用S3图像URL路径,直到lambda函数完成。如果正确授权,S3也可以提供图像服务。然后,在lambda函数完成上传到CDN之后,只需替换数据库中的图像路径。

谢谢您的精心回答,我会选择(1),因为@tarun-lalwani的建议虽然不错,但会有一些麻烦,因为我在上传时立即将资源URL归属于某些资源,并且我需要在与CDN同步时检索所有这些资源,因为它们不一定是通过对数据库资产对象的引用完成的(目前)。 - Malo Guertin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接