Вопрос по – Как определить количество актеров, которые появляются в акке?

3

Недавно я начал изучать инфраструктуру Akka 2.0 и смог запустить некоторый код, порождая актеров, которые выполняют простые вызовы базы данных оракула, выполняют простые вычисления и еще много чего, но в работе ничего не было.

Что я хочу знать, есть ли общее практическое правило или наилучшая практика для определения количества актеров, появляющихся для определенных типов задач? Например, у меня есть пул соединений из 200 соединений jdbc. Создаю ли я актера для представления каждого соединения? Создаю ли я их несколько и использую циклический подход?

Благодарю.

Ваш Ответ

2   ответа
4

сколько захотите, однако вы ограничены примерно 2 миллиардами на одного родителя, также не забудьте остановить их, когда они закончат. Кроме того, не создавайте своих актеров в качестве высшего уровня, если они на самом деле не являются актерами высшего уровня. (т.е. создавать акторы внутри акторов, используя context.actorOf вместо system.actorOf)

Вы могли бы сказать, что я - «дерево, обнимающее».
Мне нравится "ограничено примерно 2 миллиардамиper parent& Quot; часть. :)
8

Вы должны создать актера для каждой сущности, которая иначе разделяла бы изменяемое состояние между потоками. Все дело в модели актера в том, что она должна изолировать изменяемое состояние, чтобы между актерами обменивались только неизменяемые сообщения. В результате вы больше не нуждаетесь в каких-либо блокировках, и вы можете легко рассуждать о безопасности потоков вашей программы, потому что все изменяемые состояния изолированы в акторах, и вы можете положиться на структуру для правильного прохождения барьера памяти при необходимости, например, при переключении актера из одного потока в другой.

Количество потоков зависит от темы: это зависит от количества ядер и коэффициента блокировки для каждого потока, т. Е. Процент времени, которое он тратит на ожидание других потоков или подсистемы ввода / вывода. Например, если ваши актеры выполняют интенсивные вычисления процессора (например, вычисляют Pi), тогда коэффициент блокировки будет близок к 0%. Однако, если ваши актеры в основном выполняют ввод-вывод, вы можете легко предположить, что коэффициент блокирования составляет 90% или более.

Наконец, количество потоков можно рассчитать так:

int threads = Runtime.getRuntime().availableProcessors() * 100 / (100 - blockingCoefficient)

где blockingCoefficient представляет целое число от 0 до 99 включительно.

Весь вопрос о выполнении операций блокировки в актерах Akka немного сбивает с толку: не должен ли порождать выделенные потоки для таких операций блокировки и сохранять актеров строго неблокирующими? Или также приемлемо полагаться на управление потоками Akka для этого?

Похожие вопросы