1

请寻找一些圣人的建议。

我有一个简单的订单管理 FSM,有六个州。我正在指定我的系统以支持每小时 10K 订单的峰值。每个订单将需要 10 到 120 秒来遍历 FSM。一些转换将调用第三方 API。还有一个持久数据存储来保存有关订单和进度的信息。

我正在考虑将 AKKA FSM 与每个并发订单的 FSM 实例一起使用。在我花太多时间在这个项目上之前,我正在寻找一个健全的检查,如果不是一个愚蠢的想法,我希望能指出我应该特别注意的任何领域。

谢谢你的帮助!

4

1 回答 1

2

将每个订单表示为 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 参与者中进行阻塞或长时间运行的调用;在使用专用调度程序的其他参与者中隔离这些调用。

于 2017-12-21T20:49:09.047 回答