2016-09-23 70 views
1

概念名单,我有以下对象:服务织物/演员模式的物联网

  • Item - (ItemId, Name, Color)
  • ItemGroup = (GroupId, Name, Item list)

让我们假设项目可以属于多个组和项目身份和ItemActor是必要的。

对于状态演员,我有这样的:

  • ItemActor (ItemId) : Get() -> returns ItemContract { ItemId, Name, Color }
  • ItemGroupActor (GroupId) : Get() -> returns GroupContract { GroupId, Name, List<ItemContract> }

这里的问题:

  1. GroupActor应该只保留ItemIds,并强制其他人调用ItemContracts中的每个ItemActor(循环)?

  2. 或者GroupActor是否保留所有的项目细节并监听Item change事件以保持其数据保持最新状态(如视图)?

  3. 还是有第三个“ViewActor”谁一起编译数据,调用ItemActors(在一个循环),并监听事件,以保持它的数据是最新的?

  4. 还是别的什么?

这些选项都不让我最有吸引力的,因为它们要么需要循环通过事件男主角电话,或高保养项目的管理。

是否有一些指导方针来向我保证一种方式或另一种方式或对这种情况的一般方法?

回答

1

1)您应该可以直接从相应的actor通过其ID来检索ItemContract。并通过他们的演员直接对这些项目进行任何更改,否则我不理解在此使用演员ItemContract的决定。

2)这是可能的,但看起来像一个可靠的服务是一个更好的收集在这里。即使对于事件,Actor也是单线程的,所以你不会同时处理更新。这会导致糟糕的表现。

3)只需调用ItemContract的任何单个actor并用于在ItemContracts上提供更新并让任何负责ItemGroup的单个actor被调用并用于仅与组一起工作。

思考任务 - 你不必使用循环,你可以与演员并行工作(至少检索他们的状态)。

想想第三个服务,它将Group actors映射到Item actor。只需映射。没有状态更新,没有事件跟踪。但是,想警告你,在任何类型的Reliable字典中存储列表 - 是一个坏主意。

+0

谢谢你的回复!在服装面料的土地上很孤独:)我明白你在说什么。我已经明确考虑过这些方法。我的问题是,该小组将参考很多和很多项目。你会不会建议在这种情况下击中每个物品演员?我可以以某种方式分页的结果,并限制你可以拉的数量,也许... – TBone

+0

@Tbone它取决于。如果几乎所有时间都需要这些演员,并且您可以负担这种集群能力以有效地在节点间分配分区,那么可以调用每个演员检索其状态(如果该状态的大小相对较小)即可。可能有一些缓存系统的地方。如果你想节省资源,比演员不适合你,你可以尝试将整个演员的状态存储在可靠的字典中。如果在这种情况下,您将面临写入相同状态的性能问题,那么SF不适合您。 – cassandrad

+0

感谢您的意见。 Microsoft文档松散地建议您可以高效(并行)查询大量演员。这部分需要我的信心飞跃,以将我的思维方式从我通常将服务电话视为开销或昂贵的方式转变。我仍然认为我正在合作的数量足够高,值得我们进一步思考。我感谢帮助! – TBone