В настоящее время я работаю над Play! проект, который имеет следующую архитектуру:
Контроллеры → Услуги (участники) → Модели (классы обычных случаев)
Для каждого входящего запроса мы вышлем вызов слоям службы следующим образом:
Service ? DoSomething(request, context)
У нас есть определенное количество этих участников службы за маршрутизатором akka, которые создаются во время инициализации приложения и расширяются по требованию.
И в сервисе мы в основном выполняем скромные манипуляции с данными или вызовы базы данных:
receive = {
case DoSomething(x, y) => {
...
Model.doSometing(...)
sender ! result
}
}
У меня есть вторая мысль о том, следует ли нам использовать актеров для наших услуг или просто использовать только фьючерсы.
-
У нас нет какого-либо внутреннего состояния, которое необходимо изменить в субъектах службы, любое сообщение приходит в функцию и выплевывает результат. Разве это не большая сила актерской модели?
-
Мы делаем много задач, которые, кажется, сильно уходят от модели актера.
-
Мы не выполняем тяжелые вычисления, а отдаление не имеет смысла, потому что большая часть работы связана с базой данных и обращением к удаленному актеру, чтобы сделать какой-то вызов db ненужным.
-
Мы используем reactivemongo, поэтому каждый вызов db не блокируется. Мы можем сделать много этих звонков
Мне кажется, что удаление akka и просто использование Futures облегчают нам жизнь, и мы ничего не теряем.