Akka 持久性 actor 的用例是什么?

What a use case for Akka persistent actor?

我对 Akka Persistence 和持久性 Actor 的适用性感到困惑,什么时候应该使用持久性 Actor?

以给定购物应用程序的购物车模块为例,每个用户的购物车会话是否都是具有各自唯一 persistenceId 的持久性参与者?

在实际应用中的可用性如何?查询端如何处理持久化参与者的状态?当持久化角色在实际应用中没有用时?

存储状态和存储消息,是一回事吗?不是吗?有什么区别,我应该在什么时候使用它们?

谁能给我一些例子?

这将是一个非常自以为是的问题,也是一个非常自以为是的答案。

假设您有一个任务管理系统,例如吉拉或类似的。假设您有以下演员布局:

  • 项目 1
    • 工单 1
    • 票 2
  • 项目 3
    • 票 3

如果项目和工单实际上是持久性参与者,那么与标准方法(查询等)相比,您有以下好处:

  • 上下放置 actor 会恢复其状态 - 因此不再需要复杂的查询和映射到 actor 代码。此外,如果您的应用程序已关闭,重新启动它实际上会加载包含所有历史记录的数据(如下)
  • Actor model/Akka supervision 给你额外的奖励 - 如果你的 actor 已经死了(即任务在尝试从外部集成获取数据时死了),重新启动它会带回所有历史记录。
  • 跟踪历史已经存在(并且您可以对数据建模,以便事件日志实际上包括所有更改数据,如用户和时间戳,以及旧的 value/new 值)。这实际上适用于无数的业务领域——例如,贸易处理,每笔交易都必须存储自己的历史。
  • 另一部分是查询 - 如果您的系统允许最终一致的设计,您可以使用您想要的复杂查询将数据分散到项目中的所有工单并等待响应。

有用性来自应用程序的设计 - 有些非常适合(即多个独立或松散耦合的实体),有些不太适合(即你只想存储最后一组数据并生成一个它的预定义报告)