0

我有一个演员系统,它托管一个循环路由器演员,该演员具有可变数量的演员,这些演员将非常大的文件上传到存储服务器(每个演员上传一个文件)。每个文件的上传操作大约需要 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 返回负数:-(

干杯!

4

2 回答 2

2

每个链接:http ://doc.akka.io/docs/akka/2.2.3/general/message-delivery-guarantees.html

可以保证每个发送方-接收方对的消息排序。所以无需担心。

于 2014-01-07T02:37:58.997 回答
0

参与者之间的消息传递是通过队列进行的,即保持顺序

于 2014-01-07T04:45:50.633 回答