如何在微服务环境中处理文件上传?

我正在尝试决定如何处理,何时何地处理用户上传的文件。我们处于微服务环境(PHP + Linux)中,以便在未来几个月内部署新系统。一个关键组件是传入文件。

目前,正如我所看到的,有3个选项(也许还有更多我还没有意识到)。它们如下所示:

(1)

[CLIENT:file] -> 
    [GATEWAY API 
        FILE STORAGE HANDLER ->
        [a: MICROSERVICE-News]
        [b: MICROSERVICE-Authors]
        [c: MICROSERVICE-Logger]
    ] -> {response}`

在此方案中,网关 API 旨在处理直接与存储服务(S3、GCS)的通信、设置文件名、验证等。收到存储确认后,它会根据需要将该文件名和其他数据传递给其他微服务。我认为这总体上是有益的,因为文件一旦收到就会被处理,并且可能会失败而不会进一步影响其他任何事情。然而,它确实增加了网关的复杂性,并且可能会在高峰时段迅速减慢速度。

(2)

[CLIENT:file] ->
    [GATEWAY API
        [a: MICROSERVICE-Files]
        [b: MICROSERVICE-News]
        [c: MICROSERVICE-Authors]
        [d: MICROSERVICE-Logger]
    ] -> {response}

在此方案中,文件由网关 API 接收,然后必须将其传递到文件微服务。这可能是有益的,因为它消除了网关的可见性,并提供了在服务内部轻松进行更改的灵活性,例如不会影响网关。这样做的主要缺点是,现在单个文件被处理了两次,并且需要计算额外的资源。

(3)

[CLIENT:file] -> 
    [FILE API] -> {response} -> 
[CLIENT] -> 
    [GATEWAY API
        [a: MICROSERVICE-News]
        [b: MICROSERVICE-Authors]
        [c: MICROSERVICE-Logger]
    ] -> {response}

在此方案中,客户端负责将文件发送到单独的服务,并使用响应发送到网关 API。从资源的角度来看,这减轻了网关API的巨大负担,并允许它只关注数据,而不是文件。这样做的主要缺点是客户端可以向网关 API 发送错误或恶意信息,并且需要额外的验证来确保文件有效且存在。它还会在将来服务和客户端之间产生潜在的一致性问题。

我可能错过了其他选择,很想知道是否有。是否有人对此有经验,您是如何解决或处理微服务体系结构中的文件?


答案 1

我认为对于这些架构问题,没有一个放之四海而皆准的解决方案,它总是取决于你的环境和质量目标。

如果您更喜欢封装而不是性能,那么请使用解决方案(2)。您可能需要考虑对文件服务使用基于客户端的服务发现机制,而不是完整的 API 网关,以减少网关上的负载。

如果您更喜欢性能并且客户端在您的控制之下,则可以使用解决方案(3)。

不过,我会避免解决方案(1)。微服务有一个原则“将智能保留在端点中”,这意味着避免将逻辑放入API网关等基础架构组件中。


答案 2
[CLIENT:file] -> 
    [FILE API]
     -> {response}
     -> 
        [a: MICROSERVICE-News]
        [b: MICROSERVICE-Authors]
        [c: MICROSERVICE-Logger]
    ] -> {publish}

在此示例中,可以跳过网关 API。

文件 API 验证文件上传和数据内容。成功后,您向客户端发出上传已成功的响应。

稍后,在微服务中处理上传,如果此数据在其他服务中添加了新操作,则使用某种发布者通知客户端。

如果您的客户依赖于数据的处理,那么您有2个步骤。第一步是文件上传响应,它告诉您文件已成功上传并经过验证。

在这里,您可以通过更改 GUI 来对此信息做出反应,或者仍等待发布者信息。发布者将发送文件信息的输入,无论成功还是错误,以便您可以与客户一起完成步骤


推荐