通过 API 网关上传文件的架构

Posted

技术标签:

【中文标题】通过 API 网关上传文件的架构【英文标题】:Architecture to upload files via API gateway 【发布时间】:2021-12-20 22:42:12 【问题描述】:

我正在设计一个将文件上传到服务器的系统。上传文件的请求必须通过 API 网关。该请求将是一个 REST API POST 请求,请求正文是一个文件类型的表单数据(即要上传的文件的位置)。单个文件的上传应在法定文件服务器上进行复制。例如,如果我有 3 个文件服务器,则在将文件写入至少 2 个文件服务器后,客户端应该得到成功上传的确认。实际的文件上传(数据传输)应该直接在客户端和文件服务器之间进行,而不是通过 API 网关(或路径中的任何代理服务器)。

我的解决方案 - API 网关返回要写入的文件服务器(URL)列表,客户端库协调上传并确保上传发生在法定文件服务器上。但这会创建一个包含所有编排逻辑的胖客户端,并且很难针对不同的语言进行维护。

有没有更好的方法来解决这个问题?这是如何在生产服务器中完成的?例如,AWS S3/Azure blob 存储或任何其他生产级系统必须首先将请求发送到 API 网关(或代理),它们是如何处理的?

【问题讨论】:

有几件事不清楚。看起来文件服务器不是从 S3 服务中提供服务的。您明确表示客户端应直接上传到文件服务器。那么这里S3的参与是什么呢?我还有其他问题,但它们确实取决于这个问题的答案,所以我会先等待答案。 @EthanDoh:感谢您的回复。文件将由文件服务器提供服务。此处不涉及 S3 或 Azure blob 存储。这只是关于这些服务如何处理请求的后续问题。 那么文件服务器有没有web server或者其他服务可以直接接收文件? @EthanDoh 该文件直接从最终用户(例如笔记本电脑)接收。没有接收文件的服务。最终用户将使用 REST API 客户端(POST/PUT 请求)从笔记本电脑上传文件。 【参考方案1】:

您似乎正在尝试构建一个我不是专家的无服务器解决方案。

我能想到的一种方法是使用 S3 存储桶作为代理(我知道你说没有代理服务器但不知何故确实提到了 S3 ??‍♂️)存储服务器。然后,您可以设置 Lambda 服务以对 S3 上传完成执行操作。然后,该 Lambda 函数将负责将 S3 对象上传到将托管上传文件的任何文件服务器。

至少这样,客户端只需要关心上传文件一次。如果客户端需要检查是否至少有 2 个文件服务器拥有该文件,您可以使用 HEAD 请求进行轮询,因为初始请求会包含端点 url。

我不确定这是否适合您。如果没有,希望有更多无服务器架构经验的人能给你更好的答案。

【讨论】:

以上是关于通过 API 网关上传文件的架构的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud通过网关上传文件文件名中文乱码问题解决

NestJS - 文件上传到微服务

解决思路:通过Zuul上传文件接口无返回值的问题

如何通过 lambda 和 api 网关将我的 blob 上传到我的 s3 存储桶?

如何从表单将 2GB+ 的大文件上传到 .NET Core API 控制器?

Autodesk Forge - 将文件作为块上传到 Node JS 中的 BIM 360 存储时出现 504 网关超时