Проектирование системы акторов Akka для распределенных почтовых ящиков электронной почты

Я хотел бы создать систему распределенных почтовых ящиков на базе Akka. Когда мое приложение запускается, я хотел бы создать всех участников почтового ящика и запустить на них планировщик для получения писем с интервалами в 10 секунд. Но есть проблема, как создать этих актеров для входящих сообщений? Можно ли создать актор в кластере или получить ссылку на него, если он существует? Имя участника может быть UUID почтового ящика в базе данных, и только один субъект с определенным UUID может существовать в кластере.

Самый важный вопрос: как создать актор с именем uuid в кластере или получить ссылку на него, если он существует? Пробую такой конфиг:

actor {
    provider = "akka.cluster.ClusterActorRefProvider"
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    log-remote-lifecycle-events = on
    netty.tcp {
      hostname = "127.0.0.1"
      port = 2552
    }
  }

  cluster {
    seed-nodes = [
      "akka.tcp://[email protected]:2552"]
}

И этот код для создания актера или получения ссылки на него.

def createActorIfNotExists(actorSystem: ActorSystem, name: String, props: Props)
                            (implicit ec: ExecutionContext): Unit = {
    implicit val timeout = Timeout(5 seconds)

    actorSystem.actorSelection(name).resolveOne() onComplete {
      case Success(actor) =>
        Logger.debug(s"Actor already created $name")
      case Failure(ex) =>
        Logger.debug(s"Creating actor $name")
        val actor = actorSystem.actorOf(props, name)
    }
  }

Но приведенный выше код создает актора в локальной системе акторов, а не в кластере (следующий узел создает собственного актора, а не выбирает существующий).

Для исходящих я тоже думаю об актере диспетчера. Диспетчер будет одноэлементным кластером и будет отправлять сообщения правым дочерним элементам. Но может ли это быть узким местом?

Путь к актеру для синглтона может быть, например, / users / mailboxes, а для определенных исходящих ящиков / users / mailboxes / uuid.


person user2860204    schedule 26.07.2016    source источник


Ответы (1)


Похоже, то, что вы хотите сделать, довольно хорошо соответствует Akka Cluster Sharding.

Он позволяет вам обращаться к акторам с помощью идентификатора и заботится о балансировке акторов в кластере.

Подробнее об этом можно прочитать в документации здесь: http://doc.akka.io/docs/akka/2.4/scala/cluster-sharding.html#cluster-sharding-scala

person johanandren    schedule 28.07.2016
comment
Спасибо, это то, что мне нужно. Не могли бы вы сказать мне, можно ли запускать все сущности при запуске системы и запланировать для них задачу периодической загрузки писем? - person user2860204; 04.08.2016
comment
Каким-то образом вам нужно будет получить полный набор всех идентификаторов при запуске, планирование периодических загрузок может быть выполнено с помощью планировщика системы акторов. Однако вам нужно будет тщательно подумать о том, насколько масштаб вашего раствора будет соответствовать ожидаемому количеству мужских ящиков. - person johanandren; 05.08.2016