Scala / AKKA - 有多少演员在“工作”?

时间:2014-01-06 23:23:22

标签: scala akka round-robin

我有一个演员系统,它主持一个循环路由器演员,其路由可变数量的演员,将非常大的文件上传到存储服务器(每个演员上传一个文件)。上传操作每个文件大约需要10分钟。演员系统是本地的/未分发的。

如何知道在任何给定时间上传的文件数量?

我现在的解决方案是拥有一个UploadOpsActor:

case object UploadEndOp
case object UploadStartOp
case object QueryOp

object UploadOpsMonitorActor {
  def apply(): Props = Props(new UploadOpsMonitorActor())
}



class UploadOpsMonitorActor extends Actor {

  var numUploadsInProgress: Int = 0
  // number of uploads in progress , initially equal to zero

  def receive = {

    case UploadStartOp => {
      numUploadsInProgress = numUploadsInProgress + 1
    }
    case UploadEndOp => {
      numUploadsInProgress = numUploadsInProgress - 1
    }
    case QueryOp => {
      sender ! numUploadsInProgress
    }

  }

每当上传工作者演员开始上传时,它会向此UploadOpsMonitorActor发送一个“UploadStartOp”,当它完成(或失败)上传时,它会发出UploadEndOp消息。应用程序的其他组件可以发送QueryOp消息以获取正在进行的上载总数...

这有更好的解决方案吗?这样做的缺点是消息无法保证按顺序到达 - 理论上,UploadEndOp消息可能在UploadStartOp消息之前到达,这可能导致此UploadOpsMonitorActor返回负数: - (

干杯!

2 个答案:

答案 0 :(得分:2)

根据此链接:http://doc.akka.io/docs/akka/2.2.3/general/message-delivery-guarantees.html

每个发送者 - 接收者对可以保证消息排序。所以不用担心它。

答案 1 :(得分:0)

参与者之间的消息传递通过队列发生,即维持订单