事物列表的服务结构/参与者模式
Service Fabric / Actor Pattern for List of Things
概念上,我有以下对象:
Item - (ItemId, Name, Color)
ItemGroup = (GroupId, Name, Item list)
让我们假设项目可以属于多个组,并且项目标识和 ItemActor 是必要的。
对于 stateful 演员,我有这个:
ItemActor (ItemId) : Get() -> returns ItemContract { ItemId, Name, Color }
ItemGroupActor (GroupId) : Get() -> returns GroupContract { GroupId, Name, List< ItemContract > }
问题如下:
GroupActor 是否应该只保留 ItemId,并强制其他人为 ItemContracts 调用每个 ItemActor(循环)?
或者 GroupActor 是否保留所有项目详细信息并监听项目更改事件以使其数据保持最新(如视图)?
或者有第三个"ViewActor"一起编译数据,调用 ItemActors(循环),并监听事件以保持数据是最新的吗?
还是别的?
None 这些选项让我觉得特别有吸引力,因为它们要么需要循环 actor 调用,要么需要通过事件进行高维护项目管理。
是否有一些指导方针可以让我以某种方式或另一种方式向我保证或针对这种情况的一般方法?
1) 您应该能够通过 ID 直接从相应的 actor 检索 ItemContract。并直接通过他们的演员对这些项目执行任何更改,否则我不明白这里为 ItemContract 使用演员的决定。
2) 这是可能的,但看起来 Reliable Service 是一个更好的集合。即使对于事件,Actor 也是单线程的,因此您不会同时处理更新。这将导致性能不佳。
3) 只需调用 ItemContract 的任何单个 actor 并用于为 ItemContracts 提供更新,并调用负责 ItemGroup 的任何单个 actor 并仅用于与组一起工作。
想想任务——您不必使用循环,您可以并行处理参与者(至少检索它们的状态)。
考虑将 Group actor 映射到 Item actor 的第三个服务。只是映射。没有状态更新,没有事件跟踪。但是,要警告您,将列表存储在任何类型的 Reliable 字典中都是一个坏主意。
概念上,我有以下对象:
Item - (ItemId, Name, Color)
ItemGroup = (GroupId, Name, Item list)
让我们假设项目可以属于多个组,并且项目标识和 ItemActor 是必要的。
对于 stateful 演员,我有这个:
ItemActor (ItemId) : Get() -> returns ItemContract { ItemId, Name, Color }
ItemGroupActor (GroupId) : Get() -> returns GroupContract { GroupId, Name, List< ItemContract > }
问题如下:
GroupActor 是否应该只保留 ItemId,并强制其他人为 ItemContracts 调用每个 ItemActor(循环)?
或者 GroupActor 是否保留所有项目详细信息并监听项目更改事件以使其数据保持最新(如视图)?
或者有第三个"ViewActor"一起编译数据,调用 ItemActors(循环),并监听事件以保持数据是最新的吗?
还是别的?
None 这些选项让我觉得特别有吸引力,因为它们要么需要循环 actor 调用,要么需要通过事件进行高维护项目管理。
是否有一些指导方针可以让我以某种方式或另一种方式向我保证或针对这种情况的一般方法?
1) 您应该能够通过 ID 直接从相应的 actor 检索 ItemContract。并直接通过他们的演员对这些项目执行任何更改,否则我不明白这里为 ItemContract 使用演员的决定。
2) 这是可能的,但看起来 Reliable Service 是一个更好的集合。即使对于事件,Actor 也是单线程的,因此您不会同时处理更新。这将导致性能不佳。
3) 只需调用 ItemContract 的任何单个 actor 并用于为 ItemContracts 提供更新,并调用负责 ItemGroup 的任何单个 actor 并仅用于与组一起工作。
想想任务——您不必使用循环,您可以并行处理参与者(至少检索它们的状态)。
考虑将 Group actor 映射到 Item actor 的第三个服务。只是映射。没有状态更新,没有事件跟踪。但是,要警告您,将列表存储在任何类型的 Reliable 字典中都是一个坏主意。