基本的akka​​ - 定位演员及其状态

时间:2017-05-10 23:25:33

标签: akka akka.net akka-persistence

这是关于akka的几个非常基本的问题。我对akka完全是绿色的,所以任何建议都表示赞赏。

假设我有一个拥有数千名用户的应用程序 - 而不是数百万用户。

域模型是一个层次结构,其中每个用户位于一个国家/地区内,即一个国家/地区有多个地区,一个地区有多个用户。

我正在考虑在akka中创建完全相同的层次结构。 CountryActor - > * RegionActor - > * UserActor。 CountryActor / RegionActor除了作为父母之外,还有其他功能,如收集新闻,计算统计数据,监督孩子等。

Q1:以这种方式模仿域模型是否有意义?

Q2:我应该在演员中存储每个实体的属性吗? 这样,数据只需要存储一次,而akka系统也可以有效地作为内存数据库。

(伪代码)

CountryActor {
  Name,
  CountryCode,
  (children = list of RegionActors handled by akka)
}

RegionActor {
  Name,
  RegionCode,
  (children = list of UserActors handled by akka)
}

UserActor {
  UserId,
  Firstname,
  Lastname,
  Alias,
  ReceiveRegionalNews,
  ReceiveCountryNews,
  ...
}

问题3:如何通过userId高效地查找用户? 我希望UserActor的子名称是userId,但鉴于我只有userId,我仍然需要找到正确的Country和Region来执行getContent()。findChild(userId)?我是否需要保留所有userIds的完整地图并引用他们的演员?

问题4:如何按国家定位演员? 想象一下,每个用户都能够打开RegionalNews属性,这意味着他想要从RegionalActor接收新闻。每当RegionalActor想要向所有听众分发新闻时,它是如何找到它们的?它是否保留具有该属性的用户的内部地图,或者是否向所有孩子进行广播,然后发送给所有响应者?

提前致谢

1 个答案:

答案 0 :(得分:1)

我在Akka(.Net)中对这些东西进行建模方面没有丰富的经验,但我已经足够老了,知道这些范例都不是神奇的,只是因为演员系统是分层的并不意味着您可以将所有数据放入这样的结构中而不会出现可能称为阻抗不匹配的情况。

如果你想更多地思考......

  • UserManagerActor对UserActors进行一些子实体管理;
  • 除了那些国家/地区层次结构,其中至少Region实现了一些pub-sub模式并保留了其订阅者列表;
  • 当它被创建时,用户会向其相应的区域发送订阅消息(如果浮动您的船,则会发送多个订阅消息);

...那会让你需要做的一切看起来更容易吗?

There's more on design patterns here - 但不要陷入其中!