2016-08-30 45 views
1

在下面的代码中,集群节点FrontendNode如何获取已在其他集群节点BackendNode中启动的分区区域“SomeShardRegion” 的引用? 当我尝试下面的代码,我得到这个异常:碎片类型[SomeShardRegion]必须首先启动。如何从akka中检索分割区域形成不同的集群节点?

注意:我不想在FrontendNode中启动另一个“SomeShardRegion”!

object BackendNode extends App { 
    implicit val system = ActorSystem("ClusterSystem", config) 

    ClusterSharding(system).start(
    typeName = "SomeShardRegion", 
    entityProps = someProps, 
    settings = ClusterShardingSettings(system), 
    extractEntityId = idExtractor, 
    extractShardId = shardResolver) 
} 

object FrontendNode extends App { 
    implicit val system = ActorSystem("ClusterSystem", config) 

    // throws an exception: Shard type [SomeShardRegion] must be started first 
    val shardRegion = ClusterSharding(system).shardRegion("SomeShardRegion") 
} 
+0

我能问你为什么你要检索另一节点的区域?也许有一个更好的模式,你想实现 –

+0

当然。我在做DDD,并且最初希望我的web前端直接与我的聚合根区域进行对话。后来我会介绍佐贺(PM)长期运行的交易,它需要引用聚合区域来协调交易。无论哪种情况,我都会遇到上述相同的问题。你有其他建议吗?请让我知道。谢谢。 – Mutaz

+0

什么是DDD?我的Cluster-sharding-fu是生锈的,但我认为如果让分片中的节点每个都有一个侦听消息通道的本地actor(发布者流或者他们称之为的任何东西),那么会更好,那么你的前端可以在频道上进行交谈,然后听众将传播到他们的区域协调员。你将不得不处理多个消息等等。 –

回答

0

似乎我总是必须在检索它之前开始该区域。但是,如果我不希望在前端创建实体,我可以 start shard region as a proxy

+0

感谢您发布您自己的答案。这可以对许多人有用:) –

0

我发现很多人引用文档时没有指出确切的位置,所以这里是链接到文档,最近的点到answer

引用文档

消息到实体总是通过本地ShardRegion发送。 指定实体类型的ShardRegion参与者返回 ClusterSharding.start,也可以使用 ClusterSharding.shardRegion检索。如果ShardRegion尚不知道其位置,则ShardRegion将查找实体碎片的位置 。

下面一段代码

// Selecting the ShardRegion with name Counter 
val counterRegion: ActorRef = ClusterSharding(system).shardRegion("Counter") 
counterRegion ! Message