使用Akka FSM与许多并发实例



请寻找一些鼠尾草建议。

我有一个简单的订单管理FSM,具有六个州。我指出我的系统以支持10K订单一个小时的峰值。每个订单将需要10到120秒才能穿越FSM。一些过渡会召集第三方API。还有一个持久的数据存储,可以保留有关订单和进度的信息。

我正在考虑使用AKKA FSM使用同时订单的FSM实例。在我在这个项目上花费太多时间之前,我正在寻找理智的检查,如果不是一个愚蠢的主意,我将感谢任何我应该额外关注的领域。

感谢您的任何帮助!

代表每个顺序作为FSM Actor应该很好。我的"鼠尾草建议"是,如果任何第三方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是对LegacyApiActor的参考:

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

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

最新更新