举一个简单的例子:我有一个拥有1,000,000个用户的服务,每个用户都有一些个人资料信息。我想使用actor管理此配置文件信息的CRUD操作。
在 Project Orleans 中,我的理解是每个用户只有一粒,所以1,000,000个相同演员类型的虚拟粒子(只有在使用时才会创建),每个粒子都可以管理存储在其状态中的单个用户的配置文件信息。随着用户的增长,谷物的数量也在增长。
在 Service Fabric 中,如果我正确地解释文档,它的工作方式会略有不同。我会有一个有状态的actor类型来管理所有用户的CRUD操作,为了可伸缩性,我会对actor进行分区,让每个分区负责一部分用户数据。鉴于partition options,我无法看到以与Project Orleans相同的细粒度方式实现它的明显方式。
我非常喜欢奥尔良项目的方法。演员只是处理单个用户的数据,可扩展性是显而易见的(更多的用户等于更多的谷物)。记忆模型也很简单:一个演员在需要的情况下获得水分,因为它的状态很少。
似乎Service Fabric实现会稍微复杂一些。每个参与者都在处理一组用户,为了可伸缩性,我必须事先决定应该制作多少个分区,因为以后无法修改。至于内存模型,每个参与者管理的数据量随着用户数量的增长而增长。
所以我的问题是:我的理解是否正确,Service Fabric中的演员比Project Orleans更粗糙?
更新
感谢您的回答。在我的错误中,我认为一个分区包含一个actor实例,它将包含并管理分区中所有actor ID的状态。这是完全错误的。 Michiel指出分区包含许多actor实例,每个actor ID一个。因此,演员可以像在奥尔良项目中那样实施。现在,这更有意义了,谢谢。
答案 0 :(得分:5)
ActorType实际上托管在服务中。该服务已分区。每个分区将包含您的ActorType的多个实例(根据您指定的范围和分区计数)。
使用API可以获得一个Actor实例(您不必显式创建一个):
var actor = ActorProxy.Create<IActorType>(new ActorId("some id"), "fabric:/application");
在奥尔良,你的谷物被分散在筒仓上而没有将它们捆绑在隔板中。因此,奥尔良可以根据需要将单个实例移动到不同的Silo。在Service Fabric中,这一切都在分区级别完成。因此,分区中的所有实例都会一起移动。
答案 1 :(得分:2)
我对Project Orleans一无所知,但我认为你可能会混淆Service Fabric中演员和演员类型的概念。
actor是actor类型的实例 - 该关系类似于面向对象语言中的类和对象。
在您的情况下,您可以为用户提供单一的演员类型,例如UserActor然后你有很多这种类型的actor实例。那些actor实例是持有状态并被分区和分发的实例。