【问题标题】:File replication文件复制
【发布时间】:2018-07-27 09:31:18
【问题描述】:

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

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

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

附言SF 集群是本地安装。

【问题讨论】:

  • Azure Blob 存储怎么样?您能否将对象存储在那里,然后将消息放入队列中,让其他服务知道文件已准备好进行处理?
  • 这是在任何地方上传文件的最后一种情况,正如我出于法律原因写的那样。我更喜欢仅在集群中使用该文件。
  • 我不确定是否有办法做到这一点(我自己对 Service Fabric 还是新手)。您有一个无状态服务,这意味着您需要将文件存储在某处,以防服务在处理文件时出现故障。但是您不能将文件存储在集群之外的任何地方。由于这个集群是本地的,这是否可以缓解任何法律问题?可能不是因为您最初指出了这一点-但我想我会问... :)

标签: azure-service-fabric service-fabric-actor


【解决方案1】:

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

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

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

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

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

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

如果你还是喜欢走这条路,我建议:

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

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

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

【讨论】:

  • 你说得对,我只需要在 ETL-actor 获取并处理之前保存它。之后该文件(或可靠收藏中的项目)应被删除。处理单个文件的大约标称时间 - 少于 500 毫秒。在我的情况下,哪种可靠的集合是最好的选择(短时间保留一个大对象)?
  • 我已更新我的答案以添加额外信息。老实说,我从来没有在集合中存储大文件,通常我存储文件元数据并按需加载。你必须做一些测试来检查大小是否会影响系统的性能,如果运行时不会抱怨,今天是 20Mb,它可能会增加,你也应该考虑到这一点。所以最好的答案是做一个概念验证并测试它是否可以接受 20Mb、50Mb,并且可能计划将其存储在另一个可供所有节点使用的共享存储中,并且参与者只存储文件信息以进行处理。
猜你喜欢
  • 2016-12-19
  • 2018-10-03
  • 2014-08-30
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多