我有一个演员系统,它主持一个循环路由器演员,其路由可变数量的演员,将非常大的文件上传到存储服务器(每个演员上传一个文件)。上传操作每个文件大约需要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返回负数: - (
干杯!
答案 0 :(得分:2)
根据此链接:http://doc.akka.io/docs/akka/2.2.3/general/message-delivery-guarantees.html
每个发送者 - 接收者对可以保证消息排序。所以不用担心它。
答案 1 :(得分:0)
参与者之间的消息传递通过队列发生,即维持订单