Голодные актеры Akka, которые участвуют в процессе последовательности
Bisuness Logic
Мы должны выполнить следующую бизнес-логику:
1 миллион раз делают:
- скачать файл в индекс я
- распаковать файл
- извлечь некоторую информацию из файла
- удалить файл
Текущее решение Akka
Решение Akka, имеющееся у нас на данный момент, создает 1 миллион актеров, которые отвечают за загрузку одного файла, и после того, как они это сделают, они создают актера, выполняющего шаги 2,3,4.
Эта проблема
Когда мы запустили процесс, мы столкнулись с ситуацией, когда Akka отдает приоритет актерам загрузки, а остальные актеры находятся в режиме голодания.
Мы знаем, что, поскольку диск машины переполняется, потому что участники загрузки постоянно загружают, но другие участники не имеют возможности сканировать и удалять файлы.
Вопросы
- Есть ли способ заставить Акку не голодать актеров по цепочке актеров?
- Есть ли способ заставить актера загрузки подождать, пока он не получит уведомление о том, что он может продолжить (например, не более 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")
Диспетчеры, по сути, являются пулами потоков. Разделение этих двух гарантирует, что медленные, блокирующие операции не будут голодать другие. Этот подход, как правило, называется массовым, потому что идея состоит в том, что если часть приложения выходит из строя, остальная часть остается отзывчивой.
Для получения дополнительной информации см. Документацию