3

我试图了解在给定服务结构集群中随时执行给定方法(在给定参与者接口上)的参与者 ID 实例的最大数量。这是我的例子:

  1. 假设我刚刚定义了一个名为 CustomerActor 的 Actor 类,它派生自 Service Fabric 的 Actor 并实现了 ICustomerActor 接口,该接口有一个名为 Process 的方法。
  2. 假设我有一个客户端,它使用基于客户 ID 的 actorIds 向 ICustomerActor.Process 方法发送消息。对于此示例,我的客户 ID 范围在 1 到 99 之间。因此,我的演员 ID 范围是 Customer/1 到 Customer/99。
  3. 假设 CustomerActor 配置了分区数 = 9 和节点数 = 3,这意味着每个节点可能有 3 个分区。
  4. 假设客户 actorIds 在所有分区中均等分布,假设分区 1 将为客户 ID 1 到 99/9 = 11 提供服务,分区 2 将为客户 ID 12 到 22 提供服务,依此类推。
  5. 让我们假设集群在均匀分布的情况下运行良好,并且出于讨论的目的没有发生节点故障。
  6. 现在突然之间,客户端开始为特定客户 ID(无论出于何种原因)发送多个请求(快速连续),例如,位于分区 1 中的 Customer/8,并假设集群当前仅服务于 customer/8 请求.
  7. 假设客户端刚刚发送了 20 个对 ID 为 Customer/8 的参与者的请求。除了这个客户actor id,集群中没有其他流量。
  8. 假设客户端可以发送所有上述请求(不会在客户端阻塞),因为我们在 CustomerActor 类中使用提醒,它会立即将控制权返回给客户端。

以下是我的问题:

  1. 既然actor模型保证单线程编程,那么整个集群中会不会只有一个CustomerActor实例(映射到actor id:Customer/8)执行ICustomerActor.Process方法?如果是这样,这是否意味着最多可能有 19 个请求排队(假设第一个请求尚未完成)?

  2. 还是会有 3 个 CustomerActor 实例(每个节点一个)(全部映射到 actor id:Customer/8)在整个集群中同时执行 ICustomerActor.Process 方法?如果是这样,这是否意味着最多可能有 19/3 个请求排队(假设任何节点上的第一个请求尚未完成)?

  3. 还是会有 9 个 CustomerActor 实例(每个分区一个跨所有节点)(全部映射到 actor id:Customer/8)在整个集群中同时执行 ICustomerActor.Process 方法?如果是这样,这是否意味着最多可能有 19/9 个请求排队(假设任何分区上的第一个请求尚未完成)?

  4. 还是有其他我没有考虑到的行为?

4

1 回答 1

3
  1. 有一个 one 的实例Actor,使用一个 ID。Actor访问确实是“单线程访问”,因此请求排队。(这个答案是它的工作原理)
  2. Actor 托管在一个ActorService(有状态服务)中,该服务具有主副本和辅助副本。演员本身没有主要/次要概念。ActorID确定ActorService它所在的分区。
  3. 数据跨服务分区分片,所以没有。

更多阅读:

于 2016-08-01T06:53:06.530 回答