将 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 调用;在使用专用调度程序的其他参与者中隔离这些调用。