【问题标题】:Event-sourcing with akka-persistance: growing state as list?使用 akka-persistance 进行事件溯源:将状态增长为列表?
【发布时间】:2015-12-04 18:24:23
【问题描述】:

我正在使用 Akka + Scala 使用 CQRS + 事件源来设计后端。我不确定如何处理不断增长的状态。例如,我将拥有越来越多的用户列表。据我了解,每个用户都将在 UserCreated 事件之后创建,此类事件将由 PersistentActor 重播,并且用户将存储在一个集合中。比如:

class UsersActor extends PersistentActor {

    override def persistenceId = ....

    private case class UsersState(users: List[User])

    private var state = UsersState()

    ....
}

显然这样的状态最终会变得太大而无法被这个演员保存在内存中,所以我想我做错了什么。

我找到了this 示例项目:这个想法似乎每个用户都应该由不同的参与者持有,并根据需要(从事件历史记录)加载。

这样做的正确方法是什么?非常感谢。

【问题讨论】:

  • 事件溯源不适用于应用程序的所有部分。您是否需要所有用户的列表才能查询它以让用户登录或退出?
  • 感谢您的评论@jazmit - 不,我不需要同时让所有用户“出席”。我正在研究我链接的项目,它似乎只会“膨胀”它需要的项目才能提供或更新它。你有进一步的提示吗?
  • 是的,但是种子项目为每个用户使用一个持久演员。. 仍然不确定你到底在追求什么,我唯一能想到的就是不要设计不断增长的领域演员状态..

标签: scala akka cqrs event-sourcing akka-persistence


【解决方案1】:

答案是:每个聚合/实体(在我的示例中,每个用户)都有自己的参与者,它嵌入了该特定实体的状态,并且只嵌入了那个。

【讨论】:

  • +1。不是讨论的地方,但是你会根据PersistentActor 的状态修改行为吗? IE。如果名为UserCreated 的事件被持久化,你是否修改行为以便只有UserRemovedUserUpdated 事件可以持久化?或者,即如果 UserRemoved 事件被持久化,那么对于具有该特定持久性 ID 的参与者,其他任何事件都无法再持久化。
  • 确实,这就是我正在做的:根据状态修改行为。
  • 给你糖果。感谢您的快速回答。 :)
  • 解决方案看似合理,但如何获得所有User演员?
  • @BranislavLazic - 见this question
猜你喜欢
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
相关资源
最近更新 更多