【问题标题】:Actor granularity in Azure Service Fabric vs Project OrleansAzure Service Fabric 与 Project Orleans 中的参与者粒度
【发布时间】:2016-03-01 14:57:31
【问题描述】:

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

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

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

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

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

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

更新

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

【问题讨论】:

    标签: actor azure-service-fabric orleans


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢 Michiel,这为我澄清了一些事情。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复,我理解这种差异,但实际上您的回复只是点击了我。我将进行一些测试并更新我的问题。
    • 嗨,Charisk,在做了一些测试之后,还有 Michiel 的回答,我可以更好地理解你最后一段所说的话。它也回答了我的问题,但我将 Michiel 标记为答案,因为它对我来说更清楚一些。谢谢!
    猜你喜欢
    • 2017-12-17
    • 2016-04-07
    • 2016-09-24
    • 2016-07-26
    • 2018-08-18
    • 2019-11-30
    • 2017-12-27
    • 2015-12-28
    • 2019-05-20
    相关资源
    最近更新 更多