请寻找一些圣人的建议。
我有一个简单的订单管理 FSM,有六个州。我正在指定我的系统以支持每小时 10K 订单的峰值。每个订单将需要 10 到 120 秒来遍历 FSM。一些转换将调用第三方 API。还有一个持久数据存储来保存有关订单和进度的信息。
我正在考虑将 AKKA FSM 与每个并发订单的 FSM 实例一起使用。在我花太多时间在这个项目上之前,我正在寻找一个健全的检查,如果不是一个愚蠢的想法,我希望能指出我应该特别注意的任何领域。
谢谢你的帮助!
请寻找一些圣人的建议。
我有一个简单的订单管理 FSM,有六个州。我正在指定我的系统以支持每小时 10K 订单的峰值。每个订单将需要 10 到 120 秒来遍历 FSM。一些转换将调用第三方 API。还有一个持久数据存储来保存有关订单和进度的信息。
我正在考虑将 AKKA FSM 与每个并发订单的 FSM 实例一起使用。在我花太多时间在这个项目上之前,我正在寻找一个健全的检查,如果不是一个愚蠢的想法,我希望能指出我应该特别注意的任何领域。
谢谢你的帮助!
将每个订单表示为 FSM 参与者应该没问题。我的“明智的建议”是,如果任何第三方 API 调用被阻塞或长时间运行,那么将这些调用委托给在专用调度程序上运行的其他参与者,如此处所述。
例如,以下参与者进行阻塞调用,模拟第三方 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 参与者的摘录,该参与者具有等待 API 调用结果的状态,其中legacyActor
是对 a 的引用LegacyApiActor
:
onTransition {
case SomeState -> WaitForLegacyApiResult =>
legacyActor ! MakeApiCall
case ...
}
when(WaitForLegacyApiResult) {
case Event(ApiResult(res), ...) => // response from legacyActor
goto(DifferentState) ...
}
重申这一点,不要在您的订单/FSM 参与者中进行阻塞或长时间运行的调用;在使用专用调度程序的其他参与者中隔离这些调用。