分布式邮箱的Akka Actor系统设计

Akka actor system design for distributed email mailboxes

我想创建一个基于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 而不是 select 现有)。

对于发件箱,我也在考虑调度员演员。 Dispatcher 将是集群单例并向正确的 actor childs 发送消息。但它可能是瓶颈?

单例的 Actor 路径可以是 /users/mailboxes,对于特定的发件箱 /users/mailboxes/uuid

听起来你想做的事情与 Akka 集群分片非常匹配。

它允许您使用 id 寻址 actors 并负责平衡集群中的 actors。

您可以在此处的文档中阅读更多相关信息: http://doc.akka.io/docs/akka/2.4/scala/cluster-sharding.html#cluster-sharding-scala