请寻找一些圣人的建议。
我有一个简单的订单管理FSM,有六个状态。我指的是我的系统每小时支持10K订单。每个订单将需要10到120秒来遍历FSM。某些转换将调用第三方API。还有一个持久的数据存储来保存订单和进度的信息。
我正在考虑将AKKA FSM与每个并发顺序的FSM实例一起使用。在我花太多时间在这个项目之前,我正在寻找一个健全的检查,如果不是一个愚蠢的想法,我会很感激指向我应该特别注意的任何领域。
感谢您的帮助!
答案 0 :(得分:2)
将每个订单表示为FSM演员应该没问题。我的圣训建议"如果任何第三方API调用阻塞或长时间运行,则将这些调用委托给在专用调度程序上运行的其他actor,如here所述。
例如,以下actor进行阻止调用,模拟使用第三方API,并将该调用的结果发送给发件人:
class LegacyApiActor extends Actor {
implicit val executionContext: ExecutionContext =
context.system.dispatchers.lookup("my-blocking-dispatcher")
def receive = {
case MakeApiCall =>
val currentSender = sender()
Future {
Thread.sleep(10000)
currentSender ! ApiResult("result")
}
}
}
以下是来自FSM actor的摘录,其中状态等待API调用的结果,其中legacyActor
是对LegacyApiActor
的引用:
onTransition {
case SomeState -> WaitForLegacyApiResult =>
legacyActor ! MakeApiCall
case ...
}
when(WaitForLegacyApiResult) {
case Event(ApiResult(res), ...) => // response from legacyActor
goto(DifferentState) ...
}
重申一点,不要在您的订单/ FSM演员中进行阻止或长时间通话;在使用专用调度员的其他参与者中隔离这些调用。