订购履行与Akka FSM,存储状态

时间:2015-06-30 06:16:04

标签: scala akka fsm

我正在尝试使用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演员时,这个演员是否还活着,直到我们把它带到ORDER_COMPLETE(假设我们在此状态下停止演员)州?

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

  3. 继续到第二点,如果演员如何将演员带回同一州,该怎么办?主管演员只有办法解决这个问题吗?或者我们是否需要检查演员身份然后发送事件?

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

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

1 个答案:

答案 0 :(得分:0)

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