存储文件以从Service Fabric应用程序流式传输的最快方法?

时间:2019-01-20 17:18:26

标签: azure file service microservices azure-service-fabric

场景:

我想要一个服务结构应用程序,该应用程序可以在被请求时返回文件,例如[GET] /{fileId}/read

假设fileIdcustomerId相关联,例如

 =======================
   customerId  | fileId
 =======================
       1       |   1
 -----------------------
       1       |   2
 -----------------------
       1       |   3
 -----------------------
       2       |   4
 -----------------------
       2       |   5

这些是不同的组合(同一fileId上没有2个customerId)。

我希望customerId为比例单位。换句话说,customerId=326的负载不应影响customerId=913842的性能,但是customerId=326的负载可以影响其自身的性能。

我在理解状态服务,可靠的参与者,参与计划等方面经验不足。

我想知道是否可以实现将这些文件存储在节点的物理磁盘上以进行直接访问的方法。看起来像这样:

     Node0        Node1       Node2     Node3    Node4
        \         /            |          \        /
         Customer1        Customer2        Customer3

                \
                 \

                  |
                  |
                  |
           [GET] /3/stream       

,文件3可能直接存储在Node1的{​​{1}}磁盘上,因此可以快速流式传输。

这是否有可能,或者还有什么更好的方法?

1 个答案:

答案 0 :(得分:0)

我不建议您使用节点磁盘作为服务的存储。

首先,由于包含您的数据的节点可能会丢失\替换,因此您需要处理一种在服务运行的地方备份和还原这些文件的方法。另外,重新启动后节点中的临时磁盘可能会丢失数据(常见的情况)。

第二,要使服务如您所述彼此隔离,您需要使用PlacementContraints将服务固定到特定节点或NodeType,这将降低服务的可靠性,因为它们将依赖于正在运行的节点如果失败,则无法将它们放置在其他节点中。另外,您可能没有充分利用节点资源,因为您需要为客户端分配节点。

第三,要使其真正隔离,您必须将服务直接提供给客户端,并且客户端需要知道如何根据客户ID查找每个服务,从而使客户端通信与您部署服务的方式相结合。集群中的服务。如果您使用代理服务器,则将负载放在代理服务器中。

这些只是我在此设计中看到的几个问题。

有许多方法可以处理文件,但是您并没有明确说明为什么要存储这些文件。我能指出的是:

  1. 使用Azure存储存储文件
  2. 动态分配节点分区(客户),而不是将其固定到节点上
  3. 设置服务(内存和CPU)的资源限制
  4. 使用自定义指标
  5. 添加速率限制以限制每个客户的使用量

按照这些指示进行操作:

  1. 您不必担心文件的管理,因为Azure存储将根据您选择的配置为您管理复制。
  2. 动态分配的服务将充分利用资源,因此您不会为服务分配完整的节点,并且该节点未得到充分利用,浪费了资源(金钱)。
  3. 限制服务可以使用的内存和CPU的限制将防止该服务消耗过多资源而影响其他服务。
  4. 使用自定义指标,您可以让服务将负载报告给Service Fabric; Service Fabric将平衡服务,以避免其他节点繁忙时节点处于空闲状态。如果服务实例很忙,还可以用来自动缩放服务实例。
  5. 在服务中添加费率限制将防止用户滥用服务并使其使用起来更加顺畅,从而防止一个客户的突然使用高峰影响其他客户。