我正在akka 2.5.1上构建一个有两种节点(前和后)的应用程序,我使用akka分片来实现负载和数据在后面节点的分布。前端节点使用碎片代理向后发送消息。碎片初始化如下:
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.所以帮助是很好的:)
发布于 2017-06-06 15:13:16
明白了!
我犯了两个错误,对于第一个错误,请检查主问题中的更新部分。
第二个原因是,由于某种原因,集群中需要2个碎片区域(出于测试目的,我只使用了一个),如果在Akka文档中的某个地方说明了这一点,则不知道这一点。
https://stackoverflow.com/questions/44326505
复制相似问题