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

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

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

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

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


person rick.it.2004    schedule 21.12.2017    source источник
comment
А в чем вопрос?   -  person Branislav Lazic    schedule 21.12.2017


Ответы (1)


Представление каждого заказа в виде актера 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 — это ссылка на LegacyApiActor:

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

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

Повторю еще раз: не делайте блокирующих или длительных вызовов в акторах вашего заказа/FSM; изолировать эти вызовы от других субъектов, которые используют выделенные диспетчеры.

person Jeffrey Chung    schedule 21.12.2017