分布式电子邮箱的Akka actor系统设计

时间:2016-07-26 19:36:58

标签: akka actor akka-cluster

我想创建基于Akka的分布式电子邮箱系统。当我的应用程序启动时,我想创建所有收件箱演员并在它们上启动调度程序,以便以10秒的间隔接收邮件。 但是如何创建这些收件箱演员有一个问题?是否有可能在集群上创建actor或者如果它存在则引用它? Actor名称可以是数据库中的邮箱UUID,只有一个具有特定UUID的actor可以存在于集群中。

最重要的问题是如何在集群中创建具有uuid作为名称的actor,或者如果它存在则引用它?我试试这个配置:

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://mailbox@127.0.0.1:2552"]
}

此代码可以创建actor或获取对它的引用

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)
    }
  }

但是上面的代码在本地actor系统上创建actor而不是在集群上(下一个节点创建自己的actor而不是选择现有的。)

对于发件箱我也想到调度员演员。 Dispatcher将是群集单例并向正确的actor子级发送消息。但它可能是瓶颈?

单身人士的演员路径可以是例如/ users / mailboxes和特定的发件箱/用户/邮箱/ uuid

1 个答案:

答案 0 :(得分:1)

听起来你想做的事情非常适合Akka Cluster Sharding。

它允许您使用id来解决actor,并负责平衡群集中的actor。

您可以在此处的文档中详细了解它: http://doc.akka.io/docs/akka/2.4/scala/cluster-sharding.html#cluster-sharding-scala