拉各姆是持久性实体演员吗? /演员模型

时间:2018-08-31 06:46:23

标签: akka actor lagom

我正在使用Lagom的永久实体,并实现了对Cassandra的支持,并保存了进行查询的状态。因此,想要理解的是,持久实体还是参与者吗?意味着一次只能处理一个事件/命令?事件也是消息“持久实体”句柄吗? 我找不到有关以下方面的大量文档:

  • 每个实体创建后是否都保留在内存中?例如:如果用户是一个实体,并且如果将用户对象(实体)保留在内存中,则在创建新用户时,假设几乎80%的用户长时间处于离线状态,该模型如何有效地进行扩展?
  • 如果我们使用的模型在一段时间后删除了参与者,那么该参与者将不得不再次读取所有事件以处理另一个请求?这会增加延迟吗?

  • 我看到的大多数示例与实现购物车有关。如果将商品添加到购物车是通过命令/查询来处理的,那么如何确保同一商品不会两次添加到购物车?阅读/更新依赖于不同的观点/真理的来源。 (我知道在有并发用户的任何应用中都可能发生这种情况,但是使用Actors经常会出现这种情况)

2 个答案:

答案 0 :(得分:2)

  

持久性实体也是参与者吗?意味着一次只能处理一个事件/命令?

我不会这样问这个问题;参与者 do 执行同步消息处理,但是执行同步消息处理的某些事物并不表示它是参与者。

现在语义已经不合逻辑了,我们可以解决这个问题... PersistentEntity从技术上来说是not actors ...但是,PersistentEntityRegistrys will create就是{{ 3}}。

  
      
  • 每个实体创建后是否都保留在内存中?
  •   

根据该Akka持久性快照(请参阅PersistentActor)机制,实体将持久存储在您使用的任何存储中。

  
      
  • 如果我们采用的模型是在一段时间后删除了actor的,那么... actor是否必须再次读取所有事件以处理另一个请求?
  •   

同样,快照将大有帮助。

  
      
  • 如果通过命令/查询将商品添加到购物车中,如何确保同一物品不会两次添加到购物车中?
  •   

您可以了解有关Akka演员here的传递语义的更多信息。

答案 1 :(得分:1)

  1. 在配置的非活动时间后,持久性实体将从内存中删除。
  2. 通过读取最近的快照及其后的每个事件,将持久化的实体再次加载到内存中。
  3. 通过与事件日志(真相来源)建立的持久实体状态进行比较,可以验证
  4. 命令。您可以将产品存储为内部状态,并知道何时再次添加产品。然后,您可以通过不发出事件并返回错误来拒绝此命令。