使用AKKA FSM和许多并发实例

时间:2017-12-21 14:50:22

标签: akka fsm akka-persistence akka-fsm

请寻找一些圣人的建议。

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

将每个订单表示为FSM演员应该没问题。我的圣训建议"如果任何第三方API调用阻塞或长时间运行,则将这些调用委托给在专用调度程序上运行的其他actor,如here所述。

例如,以下actor进行阻止调用,模拟使用第三方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的摘录,其中状态等待API调用的结果,其中legacyActor是对LegacyApiActor的引用:

onTransition {
  case SomeState -> WaitForLegacyApiResult =>
    legacyActor ! MakeApiCall
  case ...
}

when(WaitForLegacyApiResult) {
  case Event(ApiResult(res), ...) => // response from legacyActor
    goto(DifferentState) ...
}

重申一点,不要在您的订单/ FSM演员中进行阻止或长时间通话;在使用专用调度员的其他参与者中隔离这些调用。