2016-07-26 63 views
0

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

最重要的问题是如何使用uuid作为cluster中的名称创建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://[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) 
    } 
    } 

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

对于发件箱,我也想到调度员演员。分派器将成为群集单身人士并将消息发送给正确的演员子女。但它可能是瓶颈?

为单身演员Path可以例如/用户/邮箱,并为特定的发件箱/用户/邮箱/ UUID

回答

1

听起来像是你想要做什么比赛阿卡集群拆分非常好听。

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

您可以在这里的文档阅读更多关于它: http://doc.akka.io/docs/akka/2.4/scala/cluster-sharding.html#cluster-sharding-scala

+0

谢谢,这是我需要的。你能告诉我是否有可能在系统启动时启动所有实体,并为他们安排任务以便perdiodicaly下载邮件? – user2860204

+0

您不知何故必须在启动时获得所有ids的完整集合,可以使用actor系统调度程序来安排定期下载。尽管如此,您需要仔细考虑解决方案的缩放比例与预期的男性盒子数量之间的关系。 – johanandren