【问题标题】:Akka actor system design for distributed email mailboxes分布式电子邮件邮箱的 Akka Actor 系统设计
【发布时间】:2016-11-30 14:39:28
【问题描述】:

我想创建基于 Akka 的分布式电子邮件邮箱系统。当我的应用程序启动时,我想创建所有收件箱参与者并在它们上启动调度程序以每隔 10 秒接收邮件。 但是有一个问题是如何创建这些收件箱演员?是否可以在集群上创建参与者或获取对它的引用(如果存在)? 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 将是集群单例并将消息发送给正确的参与者子节点。但它可能是瓶颈?

单例的演员路径可以是例如 /users/mailboxes 和特定的发件箱 /users/mailboxes/uuid

【问题讨论】:

    标签: akka actor akka-cluster


    【解决方案1】:

    听起来你想做的事情与 Akka Cluster Sharding 非常匹配。

    它允许您使用 id 来处理参与者,并负责平衡集群中的参与者。

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

    【讨论】:

    • 谢谢,这正是我需要的。您能否告诉我是否可以在系统启动时启动所有实体并在它们上安排任务以定期下载邮件?
    • 你必须在启动时获取所有 id 的完整集,可以使用 actor 系统调度程序来安排定期下载。不过,您需要仔细考虑您的解决方案与预期的男性盒子数量相比如何扩展。
    猜你喜欢
    • 1970-01-01
    • 2014-08-14
    • 2010-10-04
    • 2011-11-19
    • 2012-04-24
    • 2016-05-06
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多