请寻找一些鼠尾草建议。
我有一个简单的订单管理FSM,具有六个州。我指出我的系统以支持10K订单一个小时的峰值。每个订单将需要10到120秒才能穿越FSM。一些过渡会召集第三方API。还有一个持久的数据存储,可以保留有关订单和进度的信息。
我正在考虑使用AKKA FSM使用同时订单的FSM实例。在我在这个项目上花费太多时间之前,我正在寻找理智的检查,如果不是一个愚蠢的主意,我将感谢任何我应该额外关注的领域。
感谢您的任何帮助!
代表每个顺序作为FSM Actor应该很好。我的"鼠尾草建议"是,如果任何第三方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
是对LegacyApiActor
的参考:
onTransition {
case SomeState -> WaitForLegacyApiResult =>
legacyActor ! MakeApiCall
case ...
}
when(WaitForLegacyApiResult) {
case Event(ApiResult(res), ...) => // response from legacyActor
goto(DifferentState) ...
}
要重申要点,不要在订单/FSM演员中进行阻止或长时间的呼叫;将这些呼叫隔离在其他使用专用调度员的参与者中。