Голодные актеры Akka, которые участвуют в процессе последовательности

Bisuness Logic

Мы должны выполнить следующую бизнес-логику:

1 миллион раз делают:

  1. скачать файл в индекс я
  2. распаковать файл
  3. извлечь некоторую информацию из файла
  4. удалить файл

Текущее решение Akka

Решение Akka, имеющееся у нас на данный момент, создает 1 миллион актеров, которые отвечают за загрузку одного файла, и после того, как они это сделают, они создают актера, выполняющего шаги 2,3,4.

Эта проблема

Когда мы запустили процесс, мы столкнулись с ситуацией, когда Akka отдает приоритет актерам загрузки, а остальные актеры находятся в режиме голодания.

Мы знаем, что, поскольку диск машины переполняется, потому что участники загрузки постоянно загружают, но другие участники не имеют возможности сканировать и удалять файлы.

Вопросы

  1. Есть ли способ заставить Акку не голодать актеров по цепочке актеров?
  2. Есть ли способ заставить актера загрузки подождать, пока он не получит уведомление о том, что он может продолжить (например, не более 1000 параллельных файлов на диске)

Благодарю.

1 ответ

Используйте разных диспетчеров для двух типов актеров:

В вашей конфигурации вы можете определить отдельный диспетчер как (например):

my-dispatcher {
  type = Dispatcher
  executor = "thread-pool-executor"
  thread-pool-executor {
    fixed-pool-size = 32
  }
  throughput = 100
}

И тогда вы можете назначить это конкретному актеру при создании:

val myActor = context.actorOf(Props[MyActor].withDispatcher("my-dispatcher"), "myactor1")

Диспетчеры, по сути, являются пулами потоков. Разделение этих двух гарантирует, что медленные, блокирующие операции не будут голодать другие. Этот подход, как правило, называется массовым, потому что идея состоит в том, что если часть приложения выходит из строя, остальная часть остается отзывчивой.

Для получения дополнительной информации см. Документацию

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