Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Microservice环境中处理文件上载?_Php_Microservices_File Handling_Api Design - Fatal编程技术网

Php 如何在Microservice环境中处理文件上载?

Php 如何在Microservice环境中处理文件上载?,php,microservices,file-handling,api-design,Php,Microservices,File Handling,Api Design,我正在努力决定如何、何时、何地处理用户上传的文件。我们正处于一个微服务环境(PHP+Linux)中,以便在未来几个月内部署一个新系统。一个关键组件是传入文件 在我看来,目前有3种选择(可能更多,我还不知道)。详情如下: (一) 在这种情况下,网关API设计用于处理与存储服务(S3、GCS)的直接对话、设置文件名、验证等。当收到存储确认时,它会根据需要将该文件名和其他数据传递给其他微服务。我认为这总体上是有益的,因为文件一收到就被处理,并且可能会失败,而不会影响后续的任何事情。然而,它确实增加了网

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

在我看来,目前有3种选择(可能更多,我还不知道)。详情如下:

(一)

在这种情况下,网关API设计用于处理与存储服务(S3、GCS)的直接对话、设置文件名、验证等。当收到存储确认时,它会根据需要将该文件名和其他数据传递给其他微服务。我认为这总体上是有益的,因为文件一收到就被处理,并且可能会失败,而不会影响后续的任何事情。然而,它确实增加了网关的复杂性,并可能在高峰时间快速降低速度

(二)

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

(三)

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

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

[CLIENT:file] -> 
    [FILE API]
     -> {response}
     -> 
        [a: MICROSERVICE-News]
        [b: MICROSERVICE-Authors]
        [c: MICROSERVICE-Logger]
    ] -> {publish}
在本例中,您可以跳过网关api

文件api验证文件上载和数据内容。成功后,您会向客户端做出一个响应,告知上载成功

稍后,您将在您的微服务中处理上载,并使用某种发布者通知客户端是否为此数据在其他服务中添加了新操作

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

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

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

场景3适合您,您可以跳过网关api,如@Tree中所述

[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
POST https://api.site.com/v2/news

{
    "Text": "Foo and Bar",
    "location": "JPG-IMG-54f022ae8b3f4d979e925b4dp68e87"
}
Get https://api.site.com/v2/JPG-IMG-54f022ae8b3f4d979e925b4dp68e87
样本响应

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

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

{
    "Text": "Foo and Bar",
    "location": "JPG-IMG-54f022ae8b3f4d979e925b4dp68e87"
}
Get https://api.site.com/v2/JPG-IMG-54f022ae8b3f4d979e925b4dp68e87
  • 上传的文件由api网关控制
样本请求

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

{
    "Text": "Foo and Bar",
    "location": "JPG-IMG-54f022ae8b3f4d979e925b4dp68e87"
}
Get https://api.site.com/v2/JPG-IMG-54f022ae8b3f4d979e925b4dp68e87
  • 在验证之后,每个微服务执行自己的任务

我认为对于这些体系结构问题,没有一个适合所有人的解决方案,它始终取决于您的环境和质量目标

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


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

是否有任何更新?如何解决这个问题?我也遇到了类似的问题。@101110101100111101101这个挑战没有解决办法,因为我认为没有任何一种方法可以解决这个问题。我们选择使用选项3的风格。通过使用中央身份验证服务并将所有内容放在后面,我们可以让客户端处理文件,返回文件的位置(bucket)信息,然后执行实际的数据请求。通过使用bucket信息而不是文件的实际URI,在将来提供该文件之前,更容易在内部检查该文件是否存在并且是否有效。为什么不将该文件发送给将使用该文件的服务,,该服务将文件发送到存储服务以保存在任何cdn中,并返回文件的ref?在我的例子中,我正在使用微服务构建一个基于API的系统(供第三方使用),而使用终端使用我的系统的用户将不得不发送多个请求以执行一个任务