2

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

Project Orleans中,我的理解是每个用户有一个谷子,因此 1,000,000 个相同演员类型的虚拟谷子(只有在使用时才会创建),每个谷子将管理存储在其中的单个用户的个人资料信息状态。随着我的用户增长,谷物的数量也在增长。

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

我真的很喜欢 Project Orleans 中的方法。演员只是为单个用户处理数据,可扩展性是显而易见的(更多的用户等于更多的颗粒)。内存模型也很简单:单个参与者通过少量状态按需获取水分。

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

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

更新

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

4

2 回答 2

7

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

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

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

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

于 2015-11-27T15:32:12.693 回答
2

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

演员是演员类型的一个实例——这种关系类似于面向对象语言中的类和对象。

在您的情况下,您将为用户提供单一的演员类型,例如 UserActor,但是您将拥有许多该类型的演员实例。这些参与者实例是持有状态并被分区和分布的参与者。

于 2015-11-27T12:26:05.380 回答