Акка и Реактивмонго

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

Главный актер -> Рабочие актеры (может быть до 100 и более) -> MongoDB

Между воркерами и MongoDB хочу поставить reactivemongo, однако не уверен, как именно обеспечить совместное использование пула соединений между всеми акторами.

Согласно документации реактивного монго:

Экземпляр MongoDriver управляет системой акторов; соединение управляет пулом соединений. Как правило, MongoDriver или создание MongoConnection никогда не создаются более одного раза. Вы можете предоставить список из одного или нескольких серверов; драйвер угадает, является ли это автономным сервером или конфигурацией набора реплик. Даже с одним узлом-репликой драйвер будет проверять наличие других узлов и добавлять их автоматически.

Должен ли я просто создать его в главном актере, а затем связать с каждым сообщением? Итак, это будет в Мастере актера:

val driver = new MongoDriver
val connection = driver.connection(List("localhost"))

А затем я передаю подключение к акторам в сообщении. Или я должен запросить соединение в каждом рабочем актере и передать только драйвер в сообщении?

Любая помощь очень ценится. Спасибо.


person Alex K    schedule 05.09.2013    source источник


Ответы (2)


Я бы создал driver и connection в главном актере. Затем я бы настроил рабочие акторы так, чтобы они принимали экземпляр MongoConnection в качестве аргумента конструктора, чтобы каждый рабочий имел ссылку на соединение (которое на самом деле является прокси-сервером для пула соединений). Затем в чем-то вроде preStart попросите главного актера создать рабочих (которые, как я предполагаю, маршрутизируются) и указать соединение в качестве аргумента. Очень упрощенный пример может выглядеть так:

class MongoMaster extends Actor{
  val driver = new MongoDriver
  val connection = driver.connection(List("localhost"))

  override def preStart = {
    context.actorOf(Props(classOf[MongoWorker], connection).withRouter(FromConfig()))
  } 

  def receive = {
    //do whatever you need here
    ...
  }
}

class MongoWorker(conn:MongoConnection) extends Actor{
  def receive = {
    ...
  }
}

Этот код не точен, но, по крайней мере, он показывает концепции высокого уровня, которые я описал.

person cmbaxter    schedule 05.09.2013
comment
Спасибо за ваш ответ, это выглядит хорошо, я попробую. - person Alex K; 05.09.2013

Ответ cmbaxter работает до тех пор, пока вам не нужно удаленно создавать экземпляры рабочих актеров. MongoConnection не сериализуем.

Я нашел эту статью https://github.com/eigengo/akka-patterns/wiki/Configuration очень полезно. Основная идея состоит в том, чтобы реализовать трейт Configured, который заполняется основным приложением. Затем субъекты могут использовать этот признак для получения доступа к локальным несериализуемым объектам, таким как MongoConnection.

person mhalttu    schedule 20.02.2014