Scala Akka BalancingPool:没有群体变体?

Scala Akka BalancingPool:没有群体变体?,scala,akka,load-balancing,Scala,Akka,Load Balancing,我正在尝试为一组Akka参与者实现负载平衡。根据,BalancingPool提供了我感兴趣的行为(偷工作)。出于某种原因,没有“组变量”允许我自己创建路由并将它们传递给路由器。文件明确指出 平衡池没有组变体 没有说为什么。我的actor的构造函数是用在运行时计算的参数调用的,所以除了通过编程创建它们之外,我没有其他选择 val resources:List[Any] = // ... val system = ActorSystem("MySystem") val routees = resou

我正在尝试为一组Akka参与者实现负载平衡。根据,
BalancingPool
提供了我感兴趣的行为(偷工作)。出于某种原因,没有“组变量”允许我自己创建路由并将它们传递给路由器。文件明确指出

平衡池没有组变体

没有说为什么。我的actor的构造函数是用在运行时计算的参数调用的,所以除了通过编程创建它们之外,我没有其他选择

val resources:List[Any] = // ...
val system = ActorSystem("MySystem")
val routees = resources.map(r => system.actorOf(MyActor.props(r))
// This doesn't work for me, because every actor needs a resource!
val router = system.actorOf(BalancingPool(3).props(Props[MyActor]), "router")

如何创建一个
平衡池
路由器,将所有消息转发给我的参与者?为什么没有
BalancingGroup

我认为没有办法让
BalancingPool
按照编写的方式与您的参与者一起工作,但是您可以更改参与者,以便他们收到一条初始消息,提供他们需要设置的信息。如果添加此类:

case class Setup(getResource: () => Any)
下面是给你的演员的台词:

def receive = {
  case Setup(getResource) => {
    context.become(afterSetupReceive(getResource()))
  }
}

def afterSetupReceive(resource: Any) = {
  /* put cases from original recieve  here */
}
您可以创建自定义的BalancedPool,如:

val router = system.actorOf(BalancingPool(resources.length).props(Props[MyActor]), "router")
val resourcesIter = resources.iterator
val getResource = () => resourcesIter.synchronized {
  resourcesIter.next
}
router ! Broadcast(Setup(getResource))

迭代器周围的同步包装非常糟糕,但这将允许您绕过
BalancedPool

中的限制,因为向BalancePool广播不是一个好主意,所以我想出了一个解决方法。我没有发送广播,而是在参与者的同伴对象中创建了一个包含资源的同步队列。创建时,每个参与者从该队列中取出一个元素。这不是一个很好的解决方案,但它是有效的

// Router creation
val router = system.actorOf(BalancingPool(resources.length).props(Props[MyActor]), "router")

// In MyActor.scala
class MyActor {
  val resource = MyActor.resourceQueue.dequeue()

  // ...
}

object MyActor {
  val resourceQueue = {
    val queue = new mutable.SynchronizedQueue[MyResource]()
    queue.enqueue(...) // <-- resources
    queue
  }
}
//路由器创建
val router=system.actorOf(平衡池(resources.length).props(props[MyActor]),“路由器”)
//在MyActor.scala中
类MyActor{
val resource=MyActor.resourceQueue.dequeue()
// ...
}
对象MyActor{
val资源队列={
val queue=新的可变。同步队列[MyResource]()

queue.enqueue(…)//我假设没有BalancingGroup,因为routees必须共享一个邮箱。但是,当你自己创建routees时,每个人都已经有了自己的邮箱。非常感谢!我自己从来没有想到过:)我遇到了一个奇怪的错误:。似乎BalancingPool正在创建具有无效名称的演员?@wingedsubmarInner我不确定这是否可靠(由于共享邮箱)(另请参见此),并且应该删除对向BalancedPool发送广播消息的支持:@VolkerStampa现在我想起来了,这是有意义的。您对如何解决我的问题有何建议?