将 AKKA FSM 与许多并发实例一起使用
Using AKKA FSM with many concurrent instances
请寻求一些明智的建议。
我有一个简单的订单管理 FSM,有六个状态。我正在指定我的系统在一个小时的高峰期支持 10K 个订单。每个订单将花费 10 到 120 秒来遍历 FSM。一些转换会调用第三方 API。还有一个持久性数据存储来保存有关订单和进度的信息。
我正在考虑将 AKKA FSM 与每个并发订单的 FSM 实例一起使用。在我花太多时间在这个项目上之前,我正在寻找一个完整性检查,如果不是一个愚蠢的想法,我将不胜感激指出我应该特别注意的任何领域。
感谢您的帮助!
将每个订单表示为 FSM actor 应该没问题。我的 "bit of sage advice" 是,如果任何第三方 API 调用阻塞或长 运行ning,则将这些调用委托给 运行 在专用调度程序上的其他参与者, 如所述 here.
例如,以下参与者进行阻塞调用,模拟第三方 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 的摘录,该 actor 处于等待 API 调用结果的状态,其中 legacyActor
是对 LegacyApiActor
的引用:
onTransition {
case SomeState -> WaitForLegacyApiResult =>
legacyActor ! MakeApiCall
case ...
}
when(WaitForLegacyApiResult) {
case Event(ApiResult(res), ...) => // response from legacyActor
goto(DifferentState) ...
}
重申一下,不要在 order/FSM actor 中进行阻塞或长时间 运行ning 调用;在使用专用调度程序的其他参与者中隔离这些调用。
请寻求一些明智的建议。
我有一个简单的订单管理 FSM,有六个状态。我正在指定我的系统在一个小时的高峰期支持 10K 个订单。每个订单将花费 10 到 120 秒来遍历 FSM。一些转换会调用第三方 API。还有一个持久性数据存储来保存有关订单和进度的信息。
我正在考虑将 AKKA FSM 与每个并发订单的 FSM 实例一起使用。在我花太多时间在这个项目上之前,我正在寻找一个完整性检查,如果不是一个愚蠢的想法,我将不胜感激指出我应该特别注意的任何领域。
感谢您的帮助!
将每个订单表示为 FSM actor 应该没问题。我的 "bit of sage advice" 是,如果任何第三方 API 调用阻塞或长 运行ning,则将这些调用委托给 运行 在专用调度程序上的其他参与者, 如所述 here.
例如,以下参与者进行阻塞调用,模拟第三方 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 的摘录,该 actor 处于等待 API 调用结果的状态,其中 legacyActor
是对 LegacyApiActor
的引用:
onTransition {
case SomeState -> WaitForLegacyApiResult =>
legacyActor ! MakeApiCall
case ...
}
when(WaitForLegacyApiResult) {
case Event(ApiResult(res), ...) => // response from legacyActor
goto(DifferentState) ...
}
重申一下,不要在 order/FSM actor 中进行阻塞或长时间 运行ning 调用;在使用专用调度程序的其他参与者中隔离这些调用。