Akka 如何使用worker actor正确实现作业队列
我有一位演员,他代表一名长期从事繁重工作的工人:Akka 如何使用worker actor正确实现作业队列,akka,Akka,我有一位演员,他代表一名长期从事繁重工作的工人: class Worker extends Actor{ override def receive: Receive = { case "doJob" => Thread.sleep(999999) sender ! "JobResult" } } 若队列已满,我将限制作业队列并显式拒绝用户。实现此逻辑的最佳实践是什么。我是否应该使用边界邮箱或某个调度程序来监视作业队列?大概是这样的: class
class Worker extends Actor{
override def receive: Receive = {
case "doJob" =>
Thread.sleep(999999)
sender ! "JobResult"
}
}
若队列已满,我将限制作业队列并显式拒绝用户。实现此逻辑的最佳实践是什么。我是否应该使用边界邮箱或某个调度程序来监视作业队列?大概是这样的:
class Dispatcher(worker:ActorRef) extends Actor{
val MAX_JOBS = 10
var jobs = 0
override def receive: Receive = {
case "newJob" =>
if (jobs >= MAX_JOBS) sender ! "Try later"
jobs+=1
worker ! "doJob"
case "JobResult" =>
jobs-=1
}
}
bounded-mailbox { mailbox-type = "akka.dispatch.BoundedMailbox"
mailbox-capacity = 1000 mailbox-push-timeout-time = 10s }
akka.actor.mailbox.requirements {
"akka.dispatch.BoundedMessageQueueSemantics" = bounded-mailbox
}
此外,我不确定在这种情况下如何正确处理故障…我认为最好的做法是为工作者角色使用有界邮箱 然后,您可以在如下配置中配置边界:
class Dispatcher(worker:ActorRef) extends Actor{
val MAX_JOBS = 10
var jobs = 0
override def receive: Receive = {
case "newJob" =>
if (jobs >= MAX_JOBS) sender ! "Try later"
jobs+=1
worker ! "doJob"
case "JobResult" =>
jobs-=1
}
}
bounded-mailbox { mailbox-type = "akka.dispatch.BoundedMailbox"
mailbox-capacity = 1000 mailbox-push-timeout-time = 10s }
akka.actor.mailbox.requirements {
"akka.dispatch.BoundedMessageQueueSemantics" = bounded-mailbox
}
您还可以指定所需的邮箱类型(来自内置类型),或使用自己的特征和规范创建自己的自定义邮箱。(先处理哪些消息等)
我认为在您的场景中,最好是:
1.使用自己的错误机制和自定义清除/边界限制创建自己的邮箱。(基于有界邮箱特征)
3.将调度程序连接到通过配置创建的自定义邮箱