【问题标题】:Order fulfilment with Akka FSM, storing state使用 Akka FSM 完成订单,存储状态
【发布时间】:2015-09-16 19:34:55
【问题描述】:

我正在尝试使用 AKKA FSM 构建订单履行组件。我对如何存储状态以及如何根据用户的事件进一步采取基本的怀疑。

考虑状态

ORDER_CLEAN, ORDER_INIT, ORDER_PAYMENT_WAITING, ORDER_PAYMENT_SUCCESS, ORDER_DELIVERY, ORDER_COMPLETE

事件为

EV_CART_CHECKOUT, EV_PROCEED_PAYMENT, EV_PAYMENT_SUCCESSFUL, EV_ITEMS_PACKED, EV_DELIVERED

状态变化为

(EV_CART_CHECKOUT, ORDER_CLEAN) -> ORDER_INIT
(EV_PROCEED_PAYMENT, ORDER_INIT) -> ORDER_PAYMENT_WAITING
(EV_PAYMENT_SUCCESSFUL, ORDER_PAYMENT_WAITING) -> ORDER_PAYMENT_SUCCESS
(EV_ITEMS_PACKED, ORDER_PAYMENT_SUCCESS) -> ORDER_DELIVERY 
(EV_DELIVERED, ORDER_DELIVERY) -> ORDER_COMPLETE

问题

  1. 当我们创建从ORDER_CLEAN 开始并带有事件EV_CART_CHECKOUT 的FSM Actor 时,在我们将它带到ORDER_COMPLETE(假设我们在这个状态下停止actor)状态之前,这个actor 是否还活着?

  2. 如果以上点是,在这种情况下,当我们将订单状态存储在数据库中时,我们如何触发该参与者的新事件?那我们需要维护order_id 到actor 映射和触发事件吗?如果当前正在处理 10K 个唯一订单怎么办,那么我们会为所有 10K 个参与者维护映射,是吗?如果是这样,为大量订单维护这些映射的最佳数据结构是什么?

  3. 继续第 2 点,如果演员倒下,如何将演员恢复到相同的状态?主管演员是解决这个问题的唯一方法吗?还是我们需要检查actor状态然后发送事件?

  4. 在任何状态点,用户可能持续几天都不会触发下一个事件,那么让 Actor 存活更长时间是好还是创建具有更新状态的新 Actor 好?

用akka FSM解决这些问题的更好方法是什么

【问题讨论】:

    标签: scala akka fsm


    【解决方案1】:
    1. 如果我们谈论的是非持久性 Actor,一般来说,我们 不能假设它会在事件之间存在。你可能只是 重新启动或重新部署服务,所以回答你的 1. 问题 不是。
    2. 要向参与者触发新事件,您应该使用数据库中的最后一个有效状态来创建此参与者初始化状态机。
    3. 您可以使用Akka Persistence 或直接从数据库中读取当前订单状态并将其传递给参与者
    4. Actor 是非常轻量级的对象,但谈到 10k 事件,我建议在每次转换后终止 Actor

    【讨论】:

      猜你喜欢
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2015-10-23
      • 2020-06-21
      • 1970-01-01
      • 2013-06-11
      • 2017-01-05
      相关资源
      最近更新 更多