Как вы управляете подключениями к базе данных с помощью акторов Akka?

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

Это мое рассуждение до сих пор:

  • Соединение должно быть инициализировано только один раз.
  • Поскольку соединение представляет собой состояние, оно должно находиться внутри актора. Давайте назовем этого актера DatabaseConnection (просто для творчества).
  • Поскольку я не хочу делиться состоянием актера, все запросы должны выполняться внутри этого актера.
  • Драйвер базы данных, который я использую, — это реактивный монго, поэтому каждый запрос возвращает будущее, которое может быть передано отправителю.

Несмотря на то, что запросы выполняются через Futures, я не могу отделаться от мысли, что эта модель не может масштабироваться. Только один поток, управляющий всеми сообщениями доступа к базе данных? Это звучит неразумно даже с использованием фьючерсов. Я думал о том, чтобы сделать дочерних работников для управления запросами к базе данных, но мне пришлось бы делиться подключением с детьми. Мне нравится эта последняя идея, потому что, если актор DatabaseConnection умирает, все его дочерние элементы теоретически также умирают. Но я не знаю, есть ли другой лучший способ решить эту проблему без совместного использования состояния. Здесь?


person cvargascr    schedule 13.09.2017    source источник
comment
Возможный дубликат Akka и ReactiveMongo   -  person cvargascr    schedule 14.09.2017


Ответы (2)


Судя по примеру кода для реактивного монго, не похоже, что инкапсуляция актера необходима. . Изучение примера кода:

val collection = db[BSONCollection]("articles")

val query = BSONDocument()

val cursor = collection.find(query).cursor[BSONDocument]

val futureList = cursor.toList

Объект collection уже действует как объект, который инкапсулирует состояние «соединения» и отвечает на «запросы» с результатами Future. Это почти точное определение Актера, которого вы хотели создать.

Обертывание приведенного выше кода внутри тела Актера, похоже, не принесет вам многого...

person Ramón J Romero y Vigil    schedule 14.09.2017

ReactiveMongo, начиная с текущей версии 0.12.6, сам построен на Akka. Основной компонент обработки (размещенный здесь) является актёром:

trait MongoDBSystem extends Actor {
   ...
}

По сути, ReactiveMongo уже реализовал то, чего вы пытаетесь достичь, поэтому, если вы используете ReactiveMongo, нет смысла пытаться работать с деталями низкоуровневого соединения в вашем собственном акторе.

Если вы хотите понять один из способов использования акторов для обработки соединений и обслуживания запросов, изучите реализацию ReactiveMongo. В дополнение к черте MongoDBSystem, указанной выше, ознакомьтесь с MongoDriver и MongoConnection, а также тесты в DriverSpec.

person Jeffrey Chung    schedule 14.09.2017