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