【发布时间】:2020-09-29 13:40:41
【问题描述】:
如果您熟悉 Trello,将整个 Trello 看板存储为演员(具有 akka 持久性)是一个很好的用例吗?
一个 trello 板包括:
- 列表
- 列表中的任务
- 每个任务都可以有 cmets 和其他属性
在确定 akka 持久性是否是给定问题集的良好用例时,一般的最佳实践或注意事项是什么?
【问题讨论】:
标签: akka event-sourcing akka-persistence
如果您熟悉 Trello,将整个 Trello 看板存储为演员(具有 akka 持久性)是一个很好的用例吗?
一个 trello 板包括:
在确定 akka 持久性是否是给定问题集的良好用例时,一般的最佳实践或注意事项是什么?
【问题讨论】:
标签: akka event-sourcing akka-persistence
任何适合事件溯源的环境都适合 Akka Persistence。
反过来,事件溯源也普遍适用(请注意,您使用的几乎所有数据库都是事件溯源(具有异常频繁的快照、事件日志的截断和旧快照的清除)。
当您想要显式地建模域中的实体如何随时间变化时,事件溯源非常有效:您实际上是在定义变化的代数。这种变化模型越丰富(即离创建/更新越远),它就越适合事件溯源。这种变化建模反过来又有助于让系统的其他组件只在需要时更新它们的状态。
Akka Persistence,尤其是与集群分片一起使用时,可以让您处理命令/请求,而不必在每个命令/请求上从数据库中读取(基本上,当带回一个已经持久化的 actor 时,您会从数据库中读取,但是随后的命令/请求(直到演员钝化或死亡)不需要这样的读取)。 Akka 中的父子角色模型也倾向于导致多对一关系的自然编码。
在 trello 板的例子中,我可能会有
根据列表项下的数量,它们可能依次具有子持久性actor(用于 cmets 等)。
领域驱动设计可能值得一读。虽然 DDD 不需要参与者模型(反之亦然),并且它们都不需要事件溯源(反之亦然),但我和其他许多人发现它们可以相互加强。
【讨论】:
这主要取决于应用想要执行多少写入。
Akka 持久性是一种在确保数据持久性的同时实现非常高的写入吞吐量的方法,即如果参与者死亡并且内存中的数据丢失,这很好,因为写入日志会持久化到磁盘。
如果需要数据的持久性,同时不需要非常高的写入吞吐量(想象一下应用程序每秒更新 Trello 板 1 次),那么只需将数据写入外部存储就完全可以了。
【讨论】:
会将整个 Trello 看板存储为演员(使用 akka 持久性)是一个很好的用例
我会说演员的大小应该与聚合根的大小相匹配。使整个董事会成为聚合根似乎是一个非常糟糕的选择。这意味着该板上的所有操作现在都已序列化,并且不会同时发生。为什么更改卡#1 的描述与将汽车#2 移动到不同的类别相冲突?为什么创建新的棋盘类别会与将卡片 #3 分配给某人发生冲突?
我的意思是,你可以让整个系统成为一个单一的参与者,你永远不必关心竞争条件,但你也会扼杀你的可扩展性......
【讨论】:
Board AR 只是为了强制执行最大门票配额吗?