Обратите внимание: я разработчик Java и практически не знаю Scala (к сожалению). Я бы попросил, чтобы любые примеры кода, представленные в ответе, использовали Java API Akka.
Я новичок в Akka и актерах и пытаюсь настроить довольно простую систему актеров:
Итак, актор DataSplitter
запускается и разбивает довольно большой фрагмент двоичных данных, скажем, 20 ГБ, на фрагменты по 100 КБ. Для каждого фрагмента данные хранятся в DataCache
через DataCacher
. В фоновом режиме DataCacheCleaner
копается в кеше и находит фрагменты данных, которые можно безопасно удалить. Таким образом мы предотвращаем увеличение размера кеша до 20 ГБ.
После отправки фрагмента в DataCacher
для кэширования, DataSplitter
затем уведомляет ProcessorPool
о фрагменте, который теперь необходимо обработать. ProcessorPool
– это маршрутизатор/пул, состоящий из десятков тысяч различных ProcessorActors
. Когда каждый ProcessActor
получает уведомление о «обработке» фрагмента данных размером 100 КБ, он затем извлекает данные из DataCacher
и выполняет некоторую обработку.
Если вам интересно, почему я вообще здесь что-то кэширую (отсюда и DataCacher
, DataCache
и DataCacheCleaner
), я думаю, что 100 КБ — это все еще довольно большое сообщение, которое можно передать десяткам тысяч актеров. экземпляров (100 КБ * 1000 = 100 МБ), поэтому я пытаюсь просто сохранить фрагмент размером 100 КБ один раз (в кеше), а затем предоставить каждому действующему лицу доступ к нему по ссылке через API кеша.
Также есть актор Mailman
, который подписывается на шину событий и перехватывает все DeadLetters
.
Итак, всего 6 актеров:
DataSplitter
DataCacher
DataCacheCleaner
ProcessorPool
ProcessorActor
Mailman
Документы Akka проповедуют, что вы должны разлагать свою систему акторов на основе разделения подзадач, а не только по функциям, но я не совсем понимаю, как это применимо здесь. Проблема в том, что я пытаюсь организовать иерархию супервайзеров между этими актерами, и я не уверен, каков наилучший/правильный подход. Очевидно, что ProcessorPool
— это маршрутизатор, который должен быть родительским/супервизором для ProcessorActors
, поэтому у нас есть известная иерархия:
/user/processorPool/
processorActors
Но кроме этой известной/очевидной связи, я не уверен, как организовать остальных моих актеров. Я мог бы сделать их всех «одноранговыми» под одним общим/главным актером:
/user/master/
dataSplitter/
dataCacher/
dataCacheCleaner/
processorPool/
processorActors/
mailman/
Или я мог бы опустить master
(корневой) актор и попытаться сделать вещи более вертикальными вокруг кеша:
/user/
dataSplitter/
cacheSupervisor/
dataCacher/
dataCacheCleaner/
processorPool/
processorActors/
mailman/
Будучи таким новичком в Akka, я просто не уверен, как лучше поступить, и если кто-то может помочь с некоторой первоначальной поддержкой, я уверен, что все лампочки включатся. И, как бы ни была важна организация этой иерархии, я даже не уверен, какие конструкции API я могу использовать для фактического создания иерархии в коде.