【问题标题】:What a use case for Akka persistent actor?Akka 持久性演员的用例是什么?
【发布时间】:2023-03-03 05:26:21
【问题描述】:

我对 Akka Persistence 和持久性 Actor 的适用性一团糟,什么时候应该使用持久性 Actor?

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

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

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

谁能给我一些例子?

【问题讨论】:

  • 我相信持久性参与者是 CQRS 中的写入端,您仍然需要在某种可查询存储中处理读取端。根据定义,Akka 中的 Actor 是事件源的,因此我认为与任何用于处理查询的事件源系统没有根本区别(当然我意识到其余的区别)。

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


【解决方案1】:

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

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

  • 项目 1
    • 票 1
    • 票2
  • 项目 3
    • 票 3

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

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

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

【讨论】:

  • 关于Ticket概念和Actor的关系。通过这个例子,我们将有一个演员“ticket1”,另一个演员“ticket2”等等?
  • 正确 - IMO,成为 PersistentActor 的最佳人选是领域中的有状态实体 - 票证/项目/贸易/任何你喜欢的东西
  • 现在我开始明白这一点,那么像 Akka 这样的基于 Actor 的应用程序可以由数百万个 Actor 组成吗?谢谢你的回答!
  • 这样更好。 Akka 应用程序可以在运行时拥有数百万个演员——只要你有记忆力。在 Akka Persistence 案例中,您可以拥有无​​限数量的演员,让他们上下移动 - 状态存储在事件日志中
猜你喜欢
  • 2017-11-30
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多