我有一个 Web API 无状态服务,它从客户端获取文件并将其传输到参与者服务(用于延迟 ETL 操作)。文件大小限制为 20MB。
将文件直接从一个服务传输到另一个服务(在内存中作为字节数组)是个好主意吗?或者有什么特性,比如基于文件的状态,可以在集群内复制文件并进一步处理?
PS 在处理之前不可能(由于法律原因)将其上传到任何地方。
PPS SF 集群是本地安装。
我有一个 Web API 无状态服务,它从客户端获取文件并将其传输到参与者服务(用于延迟 ETL 操作)。文件大小限制为 20MB。
将文件直接从一个服务传输到另一个服务(在内存中作为字节数组)是个好主意吗?或者有什么特性,比如基于文件的状态,可以在集群内复制文件并进一步处理?
PS 在处理之前不可能(由于法律原因)将其上传到任何地方。
PPS SF 集群是本地安装。
出于以下几个原因,这样做不是一个好主意:
1 - 如果您将文件存储在 Reliable Collections 中,它会使您的集合太大并减慢复制速度,因为您的集合的每次更新都会被复制到其他节点,在周围移动服务也会很昂贵(时间)簇。
2 - 如果您不将其存储在任何集合中并将其留在内存中,Service Fabric 可能会尝试在集群中移动您的服务,您可能会丢失数据。
3 - 当您上传文件时,您必须向用户返回确认,以避免让他们等到处理完成,锁定服务器资源是一个坏主意。
4 - 将其保存到磁盘不会复制文件,如果您的服务移动到其他节点,您将失去对文件的访问权限。
有很多原因,如果无法将其保存在某个地方(如文件共享),您可以承担这些风险。
如果您仍然喜欢走这条路,我建议:
使用 actor 状态来存储每个文件会使其更加灵活,您可以在一个节点上将文件注册到您的 actor 中,如果 actor 被移动,当它在另一个节点上被激活时,actor 状态仍然可用。
请记住,您的集群有节点并且它们可能会失败,因此您不应依赖它们的内存或磁盘来保存状态,除非复制到具有不同可靠性保证的其他节点,例如天蓝色存储。