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