【问题标题】:Efficiently get state from Orleans Grain有效地从 Orleans Grain 获取状态
【发布时间】:2021-10-13 00:38:09
【问题描述】:

我在奥尔良为游戏玩家准备了一份粮食。播放器有几个我想在客户端直接访问的属性。是否有可能,是否有效,将这些作为公共财产是否有意义?或者,我应该有一个 GetAllState 方法,该方法返回一个 DTO,其中包含谷物中这些属性的当前值?

public interface IPlayerGrain : IGrainWithIntegerKey
{
    // Individual public properties to access grain state?
    string Name { get; }
    int Score { get; }
    int Health { get; }
 
    // Or, get all the current grain state as DTO?
    Task<PlayerState> GetAllState(); 
}

根据我目前的理解,我认为我需要使用 GetAllState,因为我认为任何与谷物的通信都需要通过一种方法,这可能会在孤岛之间传递。因此,您可能希望最小化传递的消息数量,并且不想传递三个消息来获取名称、分数和健康。或者,消息传递是否非常便宜,而不是我应该担心做太多事情?在我的示例中,我只包含了 3 个属性,但在我的真实游戏中还会有更多。

但是,我真的不喜欢拥有一个只是颗粒内部属性副本的贫血 DTO 模型的想法。

所以我想知道在奥尔良是否有更好的方法或首选模式?

【问题讨论】:

    标签: orleans


    【解决方案1】:

    引入复杂的返回类型以最小化往返是一个有效的解决方案。

    但是,我不会返回整个内部状态,因为我假设并非所有客户端都需要所有数据。这也可能表明您在grain 之外实现了业务逻辑,您应该将其移入grain。

    【讨论】:

      【解决方案2】:

      我认为这在很大程度上取决于属性的生命周期和访问模式。属性倾向于独立变化还是一起变化? (乍一看,它们似乎以完全不同的速度独立变化;我假设 Score 和 Health 可以非常频繁地变化,但 Name 几乎不会改变。)鉴于 Name 变化非常少,它是否适合您每次想要更新的分数或健康值时检索它的访问模式?也许 Score 和 Health 会经常一起访问,而 Name 以及其他更静态的属性也属于一起。

      如果您在考虑消息传递成本之前就让这些类型的问题驱动您的 API,您可能会发现一些很好的最佳点(可能不是谷物的全部状态)。您还可以考虑让 Player grain 和 PlayerStats grain 具有不同的生命周期,并且更接近于各种数据的变化率。

      【讨论】:

        猜你喜欢
        • 2019-07-16
        • 2014-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-15
        • 2019-03-18
        • 2010-11-09
        • 2021-05-30
        相关资源
        最近更新 更多