我有一个演员系统,承载一个循环路由器的角色,具有作为路由可变数量的演员上传非常大的文件到存储服务器(每个演员上传一个文件)。上传操作每个文件大约需要10分钟。演员系统是本地的/不是分布式的。Scala/AKKA - 有多少演员在“工作”?
如何知道在任何给定时间上传了多少个文件?
我的解决方案,现在是有一个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
}
}
每当上传工人演员开始它发出了一个“UploadStartOp”这个UploadOpsMonitorActor和上传当它完成(或失败)的上传,它感受UploadEndOp消息。应用程序的其他组件可以发送QueryOp消息,以获取正在上传的总数...
有没有更好的解决方案呢?这样做的弱点是不能保证消息按顺序到达 - 理论上的UploadEndOp消息可以在UploadStartOp消息,这可能导致该UploadOpsMonitorActor返回:-(
干杯负数之前到达