Azure Service Fabric 与 Project Orleans 中的参与者粒度

Actor granularity in Azure Service Fabric vs Project Orleans

举一个简单的例子:我有一个服务有 1,000,000 个用户,每个用户都有一些个人资料信息。我想使用 actor 管理此配置文件信息的 CRUD 操作。

Orleans 项目 中,我的理解是我会为每个用户提供一个 grain,因此 1,000,000 个相同 actor 类型的虚拟 grain(只有在使用时才会创建),每个 grain 将管理存储在其状态中的单个用户的个人资料信息。随着我的用户越来越多,grains的数量也越来越多。

Service Fabric 中,如果我对文档的解释正确,它的工作方式会略有不同。我将有一个有状态的 actor 类型来管理 all 用户的 CRUD 操作,并且为了可扩展性,我将对 actor 进行分区,让每个分区负责用户数据的一个子集。考虑到 partition options,我看不到一个明显的方法来以与 Project Orleans 相同的细粒度方式来实现它。

我非常喜欢 Project Orleans 中的方法。 actor 只是为单个用户处理数据,可扩展性是显而易见的(更多用户等于更多 grains)。内存模型也很简单:单个 actor 以其少量状态按需补充水分。

似乎 Service Fabric 实现会稍微复杂一些。每个参与者都在处理一组用户,为了可伸缩性,我必须提前决定我应该制作多少个分区,因为以后无法修改。至于内存模型,每个参与者管理的数据量随着用户数量的增长而增长。

所以我的问题是:我的理解是否正确,Service Fabric 中的参与者只是比 Project Orleans 更粗粒度?

更新

感谢您的回答。我的错误是认为分区包含单个参与者实例,该实例将包含和管理分区内所有参与者 ID 的状态。这是完全错误的。 Michiel 指出一个分区包含许多参与者实例,每个参与者 ID 一个。因此,可以采用与 Orleans 项目相同的方式来实现参与者。现在这更有意义了,谢谢。

我对 Project Orleans 了解不多,但我认为您可能混淆了 Service Fabric 中参与者和参与者类型的概念。

actor 是 actor 类型的实例 - 这种关系类似于 类 和面向对象语言中的对象。

在您的情况下,您会为用户提供单一的参与者类型,例如UserActor 但是你会有很多这种类型的 actor 实例。这些 actor 实例是保存状态并被分区和分布的实例。

ActorType 实际上托管在服务中。该服务是分区的。每个分区将包含您的 ActorType 的多个实例(根据您指定的范围和分区计数)。

使用 API 您可以获得一个 Actor 实例(您不必显式创建一个):

var actor = ActorProxy.Create<IActorType>(new ActorId("some id"), "fabric:/application");

在奥尔良,您的谷物散布在筒仓中,而没有将它们捆绑在分区中。因此,Orleans 可以根据需要将单个实例移动到不同的 Silo。在 Service Fabric 中,这一切都在分区级别完成。因此分区中的所有实例都一起移动。