我有一個演員系統,承載一個循環路由器的角色,具有作爲路由可變數量的演員上傳非常大的文件到存儲服務器(每個演員上傳一個文件)。上傳操作每個文件大約需要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返回:-(
乾杯負數之前到達