【发布时间】: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