Это может быть субъективно, я бы предпочел второй вариант.
- Это позволяет мне сузить свое мышление до одной маленькой проблемы, когда я нахожусь в роли этого детского актера, и я не думаю о более широкой картине при этом.
- Breaking таким же образом помогите тестировать логи c в отдельности, в дополнение к любым более крупным тестам
- Дочерний актер может быть убит и повторно создан, не затрагивая все остальные элементы
- Актеры дешевы, и миллионы могут быть созданы на типичном оборудовании
- Распределенные данные: в более сложном случае это может помочь вам масштабироваться по разным узлам. Например, у вас может быть кластер akka, в котором каждый узел кластера отвечает за подмножество сущностей (иначе говоря, sharding)
Когда я должен сохранять сущность как состояние актера или моделировать его как дочерний актер?
По моему личному опыту, когда у вас есть иерархическое состояние, а состояние 2-го уровня требует отдельных операций, имеет смысл создать дочерний субъект для каждого объекта 2-го уровня. Например:
case class Employee(Id, Name, Address)
В этом случае, если для всех сотрудников существует только актер высшего уровня, ему, вероятно, потребуется состояние, подобное:
Map[Id, Employee]
И если сообщения следующим образом: AddEmployee(Employee)
, DeleteEmployee(Id)
тогда это не имеет большого значения. Но если они имеют вид: UpdateName(Id, Name)
или UpdateAddress(Id, Address)
, тогда становится затруднительно управлять этими операциями на этой карте.