Akka-Cluster-Sharding:本地ShardRegion(系统).shardRegion(_)

时间:2016-04-12 03:37:38

标签: scala akka akka-cluster

我有一个主要的Actor负责初始化一些worker actor(有两种类型的worker actor,即ParamServer actor和DataShard actor)。例如,如果我通过ClusterSharding(system).start(_,_,_,_,_)启动了20个datashard actor,之后我想向所有datashard actor发送一些消息(比如case object ReadyToProcess)。我读到我可以通过本地ShardRegion(system).shardRegion(_)向Akka Cluster Shard中的实体发送消息。本地 shardRegion(_)是否会发送到所有datashards或只发送一个。如何将msgs发送给所有datashard演员? 给出的大师班是:

class Master(ports: Seq[String],
         dataSet: Seq[Example],
         dataPerReplica: Int,
         layerDimensions: Seq[Int],
         activation: ActivationFunction,
         activationFunctionDer: ActivationFunction,
         learningRate: Double) extends Actor with ActorLogging  {

val dataShards = dataSet.grouped(dataPerReplica).toSeq
val numLayers = layerDimensions.size
var numShardsFinished = 0

ports foreach { port =>

  val config = ConfigFactory.parseString("akka.remote.netty.tcp.port=" + port).withFallback(ConfigFactory.load())
  val clusterSystem = ActorSystem("ClusterSystem", config)

  val paramServerRegions: Array[ActorRef] = new Array[ActorRef](numLayers - 1)

  for (i <- 0 to numLayers - 2) {

    paramServerRegions(i) = ClusterSharding(clusterSystem).start(
      typeName = ParamServer.shardName,
      entityProps = ParamServer.props(i, dataShards.size, learningRate, NeuralNetworkOps.randomMatrix(layerDimensions(i + 1), layerDimensions(i) + 1)),
      settings = ClusterShardingSettings(clusterSystem),
      extractEntityId = ParamServer.extractEntityId,
      extractShardId = ParamServer.extractShardId
    )
  }

  //create actors for each data shard/replica.  Each replica needs to know about all parameter shards because they will
  //be reading from them and updating them
  val dataShardRegions: Array[ActorRef] = new Array[ActorRef](dataShards.size)

  for (i <- 0 to dataShards.size) {

    dataShardRegions(i) = ClusterSharding(clusterSystem).start(
      typeName = DataShard.shardName,
      entityProps = DataShard.props(i, clusterSystem, dataShards(i), activation, activationFunctionDer, paramServerRegions),
      settings = ClusterShardingSettings(clusterSystem),
      extractEntityId = ParamServer.extractEntityId,
      extractShardId = ParamServer.extractShardId
    )
  }

}

def receive: Receive = {

case Start => {
  val shardRegionSender =   ClusterSharding(context.system).shardRegion(DataShard.shardName)
  println("Tomosha boshlandi")
  shardRegionSender ! ReadyToProcess
}

case ShardDone(id) => {

    numShardsFinished+=1
    log.info("")

    if (numShardsFinished == dataShards.size) {
        context.parent ! JobDone
        context.stop(self)
    }
}
}

}

0 个答案:

没有答案