0

我有一个 Web API 无状态服务,它从客户端获取文件并将其传输到参与者服务(用于延迟 ETL 操作)。文件大小限制为 20MB。

将文件直接从一个服务传输到另一个服务(在内存中作为字节数组)是个好主意吗?或者有什么特性,比如基于文件的状态,可以在集群内复制文件并进一步处理?

PS 在处理之前不可能(由于法律原因)将其上传到任何地方。

PPS SF 集群是本地安装。

4

1 回答 1

0

出于以下几个原因,这样做不是一个好主意:

1 - 如果您将文件存储在 Reliable Collections 中,它会使您的集合太大并减慢复制速度,因为您的集合的每次更新都会被复制到其他节点,在周围移动服务也会很昂贵(时间)簇。

2 - 如果您不将其存储在任何集合中并将其留在内存中,Service Fabric 可能会尝试在集群中移动您的服务,您可能会丢失数据。

3 - 当您上传文件时,您必须向用户返回确认,以避免让他们等到处理完成,锁定服务器资源是一个坏主意。

4 - 将其保存到磁盘不会复制文件,如果您的服务移动到其他节点,您将失去对文件的访问权限。

有很多原因,如果无法将其保存在某个地方(如文件共享),您可以承担这些风险。

如果您仍然喜欢走这条路,我建议:

  • 将内容发送给将处理它的演员,演员将其保存到演员状态。
  • 在参与者中注册一个计时器(或提醒,取决于您的要求)以触发该文件的处理。
  • 在处理后创建逻辑以停用计时器,并在处理后将输出保存到某处。
  • 停用演员并删除状态。

使用 actor 状态来存储每个文件会使其更加灵活,您可以在一个节点上将文件注册到您的 actor 中,如果 actor 被移动,当它在另一个节点上被激活时,actor 状态仍然可用。

请记住,您的集群有节点并且它们可能会失败,因此您不应依赖它们的内存或磁盘来保存状态,除非复制到具有不同可靠性保证的其他节点,例如天蓝色存储。

于 2018-02-19T11:39:01.520 回答