从 Orleans Grain 高效获取状态
Efficiently get state from Orleans Grain
我在奥尔良为玩家们准备了一款游戏。播放器有多个属性,我想在客户端中直接访问这些属性。是否有可能,是否有效,将这些作为 public 属性放在谷物上是否有意义?或者,我应该有一个 GetAllState 方法,该方法 returns 一个具有 grain 中这些属性的当前值的 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,因为我认为与 grain 的任何通信都需要通过一种方法进行,并且这可能会在筒仓之间传递。因此,您可能希望尽量减少传递的消息数量,并且不想传递三个消息来获取 Name、Score 和 Health。或者,消息传递是否非常便宜,而不是我应该担心做太多的事情?在我的示例中,我只包含了 3 个属性,但在我的真实游戏中会有更多。
但是,我真的不喜欢拥有一个贫乏的 DTO 模型的想法,它只是 grain 内部属性的一个副本。
所以我想知道在奥尔良是否有更好的方法或首选模式?
引入复杂的 return 类型来最小化往返是一个有效的解决方案。
但是,我不会 return 整个内部状态,因为我假设并非所有客户端都一直需要所有数据。这也可能表明您在 grain 之外实现了业务逻辑,您应该将其移入 grain。
我认为这在很大程度上取决于属性的生命周期和访问模式。这些属性倾向于独立变化还是一起变化? (乍一看,它们似乎独立地以完全不同的速度变化;我假设 Score 和 Health 可以非常频繁地变化,但 Name 几乎永远不会改变。)并且鉴于 Name 变化很少,它是否适合您的访问模式在每次您想要更新的分数或健康值时检索它?也许 Score 和 Health 会经常一起访问,而 Name 和其他更静态的属性也属于一起。
如果在考虑消息传递的成本之前让这些类型的问题驱动您的 API,您可能会找到一些好的最佳点(可能不是谷物的全部状态)。您还可以考虑让 Player grain 和 PlayerStats grain 具有不同的生命周期,并且更接近于各种数据的变化率。
您可能还会考虑 Health
和 Score
,它们可能会经常更改,暴露在 stream.
中
我在奥尔良为玩家们准备了一款游戏。播放器有多个属性,我想在客户端中直接访问这些属性。是否有可能,是否有效,将这些作为 public 属性放在谷物上是否有意义?或者,我应该有一个 GetAllState 方法,该方法 returns 一个具有 grain 中这些属性的当前值的 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,因为我认为与 grain 的任何通信都需要通过一种方法进行,并且这可能会在筒仓之间传递。因此,您可能希望尽量减少传递的消息数量,并且不想传递三个消息来获取 Name、Score 和 Health。或者,消息传递是否非常便宜,而不是我应该担心做太多的事情?在我的示例中,我只包含了 3 个属性,但在我的真实游戏中会有更多。
但是,我真的不喜欢拥有一个贫乏的 DTO 模型的想法,它只是 grain 内部属性的一个副本。
所以我想知道在奥尔良是否有更好的方法或首选模式?
引入复杂的 return 类型来最小化往返是一个有效的解决方案。
但是,我不会 return 整个内部状态,因为我假设并非所有客户端都一直需要所有数据。这也可能表明您在 grain 之外实现了业务逻辑,您应该将其移入 grain。
我认为这在很大程度上取决于属性的生命周期和访问模式。这些属性倾向于独立变化还是一起变化? (乍一看,它们似乎独立地以完全不同的速度变化;我假设 Score 和 Health 可以非常频繁地变化,但 Name 几乎永远不会改变。)并且鉴于 Name 变化很少,它是否适合您的访问模式在每次您想要更新的分数或健康值时检索它?也许 Score 和 Health 会经常一起访问,而 Name 和其他更静态的属性也属于一起。
如果在考虑消息传递的成本之前让这些类型的问题驱动您的 API,您可能会找到一些好的最佳点(可能不是谷物的全部状态)。您还可以考虑让 Player grain 和 PlayerStats grain 具有不同的生命周期,并且更接近于各种数据的变化率。
您可能还会考虑 Health
和 Score
,它们可能会经常更改,暴露在 stream.