【发布时间】: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
问题
当我们创建从
ORDER_CLEAN开始并带有事件EV_CART_CHECKOUT的FSM Actor 时,在我们将它带到ORDER_COMPLETE(假设我们在这个状态下停止actor)状态之前,这个actor 是否还活着?如果以上点是,在这种情况下,当我们将订单状态存储在数据库中时,我们如何触发该参与者的新事件?那我们需要维护
order_id到actor 映射和触发事件吗?如果当前正在处理 10K 个唯一订单怎么办,那么我们会为所有 10K 个参与者维护映射,是吗?如果是这样,为大量订单维护这些映射的最佳数据结构是什么?继续第 2 点,如果演员倒下,如何将演员恢复到相同的状态?主管演员是解决这个问题的唯一方法吗?还是我们需要检查actor状态然后发送事件?
在任何状态点,用户可能持续几天都不会触发下一个事件,那么让 Actor 存活更长时间是好还是创建具有更新状态的新 Actor 好?
用akka FSM解决这些问题的更好方法是什么
【问题讨论】: