akka 分片代理无法与协调器联系

akka sharding proxy cannot contact with coordinator

我正在 akka 2.5.1 上构建一个具有两种节点(前端和后端)的应用程序,我正在使用 akka 分片在后端节点之间进行负载和数据分布。前端节点使用 shard proxy 向后端发送消息。分片初始化如下:

  val renditionManager: ActorRef =
if(nodeRole == "back")
  clusterSharding.start(
    typeName = "Rendition",
    entityProps = Manger.props,
    settings = ClusterShardingSettings(system),
    extractEntityId = Manager.idExtractor,
    extractShardId = Manager.shardResolver)
else
  clusterSharding.startProxy(
    typeName = "Rendition",
    role = None,
    extractEntityId = Manager.idExtractor,
    extractShardId = Manager.shardResolver)

我得到了一些死信日志(为了简洁省略了大部分条目):

[info] [INFO] [06/02/2017 11:39:13.770] [wws-renditions-akka.actor.default-dispatcher-26] [akka://wws-renditions/system/sharding/RenditionCoordinator/singleton/coordinator] Message [akka.cluster.sharding.ShardCoordinator$Internal$Register] from Actor[akka.tcp://wws-renditions@127.0.0.1:2552/system/sharding/Rendition#1607279929] to Actor[akka://wws-renditions/system/sharding/RenditionCoordinator/singleton/coordinator] was not delivered. [8] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[info] [INFO] [06/02/2017 11:39:15.607] [wws-renditions-akka.actor.default-dispatcher-21] [akka://wws-renditions/system/sharding/RenditionCoordinator/singleton/coordinator] Message [akka.cluster.sharding.ShardCoordinator$Internal$RegisterProxy] from Actor[akka://wws-renditions/system/sharding/Rendition#-267271026] to Actor[akka://wws-renditions/system/sharding/RenditionCoordinator/singleton/coordinator] was not delivered. [9] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[info] [INFO] [06/02/2017 11:39:15.762] [wws-renditions-akka.actor.default-dispatcher-21] [akka://wws-renditions/system/sharding/replicator] Message [akka.cluster.ddata.Replicator$Internal$Status] from Actor[akka.tcp://wws-renditions@127.0.0.1:2552/system/sharding/replicator#-126233532] to Actor[akka://wws-renditions/system/sharding/replicator] was not delivered. [10] dead letters encountered, no more dead letters will be logged. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.

如果我尝试使用代理,它无法传送并显示:

[info] [WARN] [06/02/2017 12:12:28.047] [wws-renditions-akka.actor.default-dispatcher-15] [akka.tcp://wws-renditions@127.0.0.1:2551/system/sharding/Rendition] Retry request for shard [51] homes from coordinator at [Actor[akka.tcp://wws-renditions@127.0.0.1:2552/system/sharding/RenditionCoordinator/singleton/coordinator#-1550443839]]. [1] buffered messages. 

另一方面,如果我在两个节点(前端和后端)中启动一个非代理分片,它会正常工作。

有什么建议吗?谢谢。

更新

我终于弄明白为什么它试图连接到错误节点中的碎片。如果只是想在单一种类的节点启动分片需要添加如下配置

akka.cluster.sharding {
  role = "yourRole"
}

这样,akka 分片只会在标记有角色 "yourRole"

的节点上查找

代理仍然无法与分片协调器连接并向分片传送消息并得到以下日志跟踪:

[WARN] [06/06/2017 12:09:25.754] [cluster-nodes-akka.actor.default-dispatcher-16] [akka.tcp://cluster-nodes@127.0.0.1:2551/system/sharding/Manager] Retry request for shard [52] homes from coordinator at [Actor[akka.tcp://cluster-nodes@127.0.0.1:2552/system/sharding/ManagerCoordinator/singleton/coordinator#-2111378619]]. [1] buffered messages.

所以帮助会很好 :)

知道了!

我犯了 2 个错误,第一个错误检查主要问题中的更新部分。

第二个原因是,由于某种原因,集群中需要 2 个分片区域(出于测试目的,我只使用了一个),不知道 Akka 文档中是否有说明。