使用AKKA FSM和许多并发实例

问题描述 投票:0回答:1

请寻找一些圣人的建议。

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

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

谢谢你的帮助!

akka fsm akka-persistence akka-fsm
1个回答
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演员中进行阻止或长时间调用;在使用专用调度程序的其他参与者中隔离这些调用。

© www.soinside.com 2019 - 2024. All rights reserved.