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

时间:2017-12-12 22:01:03

标签: php microservices file-handling api-design

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

目前正如我所看到的那样有三种选择(可能还有更多,我还没有意识到)。它们如下:

(1)

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

在这种情况下,Gateway API旨在处理与存储服务(S3,GCS)的直接对话,设置文件名,验证等。当收到存储确认时,它会将该文件名和其他数据传递给其他MicroServices根据需要。我认为这对整体有益,因为文件在收到后立即处理,并且可以在不影响其他任何其他内容的情况下发生故障。然而,它确实增加了网关的复杂性,并且可能在高峰时间迅速减慢速度。

(2)

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

在这种情况下,Gateway API会收到该文件,然后必须将其传递给文件MicroService。这可能是有益的,因为它可以远离网关,并且提供了在服务内轻松进行更改的灵活性,而不会影响网关。这样做的主要缺点是,现在单个文件被处理两次,需要计算额外的资源。

(3)

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

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

我可能会错过其他选项,并且很想知道是否有。有没有人有这方面的经验,你是如何解决或处理MicroService架构中的文件的?

3 个答案:

答案 0 :(得分:0)

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

在此示例中,您可以跳过Gateway api。

You File api验证文件上传和数据内容。成功完成后,您向客户端做出响应,说明上传成功。

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

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

在这里您可以通过更改gui对此信息作出反应,或者仍然等待发布者信息。 Publisher将通过成功或错误发送对文件信息的植入,因此您可以与客户一起完成步骤

答案 1 :(得分:0)

经过长时间的研究,我终于找到了解决方案。

场景3非常适合您,您可以跳过@api中显示的Gateway api

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

示例场景

  • 用户请求上传文件

样品申请

POST https://api.site.com/media/upload

示例响应

{
    "location": "JPG-IMG-54f022ae8b3f4d979e925b4dp68e87"
}
  • 用户发送共享新闻的请求

样品申请

POST https://api.site.com/v2/news

{
    "Text": "Foo and Bar",
    "location": "JPG-IMG-54f022ae8b3f4d979e925b4dp68e87"
}
  • 上传的文件由api网关控制

样品申请

Get https://api.site.com/v2/JPG-IMG-54f022ae8b3f4d979e925b4dp68e87
  • 验证后,每个微服务都会执行自己的任务

答案 2 :(得分:0)

我认为对于这些架构问题,没有万能的解决方案,这始终取决于您的上下文和质量目标。

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

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

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