Использование AKKA FSM со многими параллельными экземплярами

Ищите немного мудрого совета, пожалуйста.

У меня есть простое управление заказами FSM с полдюжины штатов. Я настраиваю свою систему на поддержку 10 тыс. Заказов в час. Каждый заказ займет от 10 до 120 секунд, чтобы пройти через FSM. Некоторые переходы будут вызывать сторонние API. Существует также постоянное хранилище данных для хранения информации о порядке и ходе выполнения.

Я думаю об использовании AKKA FSM с экземпляром FSM для каждого параллельного заказа. Прежде чем я потрачу слишком много времени на этот проект, я ищу проверку работоспособности и, если не глупую идею, буду признателен за указатели на любые области, на которые мне следует обратить особое внимание.

Спасибо за любую помощь!

1 ответ

Решение

Представление каждого заказа как актера ФСМ должно быть хорошо. Мой "мудрый совет" заключается в том, что если какие-либо сторонние вызовы 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; изолировать эти звонки от других действующих лиц, которые используют выделенных диспетчеров.

Другие вопросы по тегам