Как передать одно и то же строковое сообщение всем актерам через ConsistentHashingPool в akka - PullRequest
0 голосов
/ 19 апреля 2020

Я новичок в Акке и застрял с этой проблемой.

У меня 4 актера, но каким-то образом широковещательное сообщение всегда идет одному актеру

вот пример кода

        def hashMapping: ConsistentHashMapping = {
        case ReduceNameTitlePair(name,title) => {
        //println(s"\n *** Using ${name} as the key")
        name
        }
        }

        var actorReduceRouter = context.actorOf(RemoteRouterConfig(ConsistentHashingPool(numReducers,hashMapping = hashMapping), addresses).props(Props(classOf[ReduceActor])))

        actorReduceRouter ! Broadcast("SEND ME YOUR DATA"))

Пожалуйста, помогите

1 Ответ

0 голосов
/ 21 апреля 2020

В Classi c Актеры вы можете использовать Broadcast, чтобы отправить сообщение всем акторам в маршрутизаторе, включая ConsistentHashingRouter. Когда я запускаю приведенный ниже код, я получаю сообщение, полученное по всем трем актерам.

Вы, похоже, используете широковещательную рассылку выше, поэтому я с подозрением отношусь к вашей удаленной конфигурации. Но так как вы не публикуете здесь ничего о настройке удаленного взаимодействия, я мало что могу сделать для устранения неполадок. Я бы рекомендовал использовать маршрутизаторы с поддержкой кластеров вместо удаленного взаимодействия, но я не знаю, связано ли это каким-либо образом с вашей проблемой.

import akka.actor.{Actor, ActorLogging, ActorSystem, Props}
import akka.routing.{Broadcast, ConsistentHashingPool}
import akka.routing.ConsistentHashingRouter.ConsistentHashMapping

object Worker {
  def props(): Props = Props(new Worker())
}
class Worker extends Actor with ActorLogging {
  def receive = {
    case s: String => log.info(s"${self.path.name} : $s")
  }
}

object AkkaQuickstart extends App {
  val system = ActorSystem("UntypedRouter")
  def hashHapping: ConsistentHashMapping = {
    case s: String => s
  }
  val router = system.actorOf(
    ConsistentHashingPool(3, hashMapping = hashHapping).props(Worker.props())
  )
  router ! Broadcast("hello")
}
...