Scala如何使用akka actor有效地处理超时操作

     2023-02-16     56

关键词:

【中文标题】Scala如何使用akka actor有效地处理超时操作【英文标题】:Scala how to use akka actors to handle a timing out operation efficiently 【发布时间】:2013-07-11 11:46:53 【问题描述】:

我目前正在使用 Rhino 在一个安静的服务中评估 javascript 脚本。我希望有一个评估超时。 我创建了一个模拟示例演员(使用 scala 2.10 akka 演员)。

case class Evaluate(expression: String)

class RhinoActor extends Actor 

  override def preStart() =  println("Start context'"); super.preStart()

  def receive = 
    case Evaluate(expression) ⇒ 
      Thread.sleep(100)
      sender ! "complete"
    
  

  override def postStop() =  println("Stop context'"); super.postStop()

现在我运行如下使用这个actor:

  def run 
    val t = System.currentTimeMillis()
    val system = ActorSystem("MySystem")

    val actor = system.actorOf(Props[RhinoActor])

    implicit val timeout = Timeout(50 milliseconds)
    val future = (actor ? Evaluate("10 + 50")).mapTo[String]

    val result = Try(Await.result(future, Duration.Inf))

    println(System.currentTimeMillis() - t)
    println(result)
    actor ! PoisonPill

    system.shutdown()
  

在这样一个可能同时有请求的闭包中使用 ActorSystem 是否明智?

我应该将 ActorSystem 设为全局吗,在这种情况下可以吗?

有没有更合适的替代方法?

编辑:我认为我需要直接使用期货,但我需要 preStart 和 postStop。目前正在调查。 编辑:似乎你没有得到期货的那些钩子。

【问题讨论】:

【参考方案1】:

我会尽力为您解答一些问题。

首先,ActorSystem 是一个非常重的构造。您不应该为需要参与者的每个请求创建一个。您应该全局创建一个,然后使用该单个实例来生成您的演员(在run 中您将不再需要system.shutdown())。我相信这涵盖了您的前两个问题。

您在这里使用演员执行 javascript 的方法对我来说似乎是合理的。但是,您可能希望在Router 后面汇集一堆RhinoActors,而不是每个请求都启动一个actor,每个实例都有自己的rhino 引擎,该引擎将在preStart 期间设置。这样做将消除每个请求的犀牛初始化成本,加快你的 js 评估。只要确保你的游泳池大小合适。此外,如果您采用这种方法,则无需为每个请求发送 PoisonPill 消息。

您可能还想查看非阻塞回调 onCompleteonSuccessonFailure,而不是使用阻塞 Await。这些回调也尊重超时,并且比阻塞更高的吞吐量更可取。只要上游等待此响应的任何方式都可以处理异步性(即支持异步的 Web 请求),那么我建议走这条路线。

最后要记住的是,即使代码会在超时后返回给调用者,如果参与者尚未响应,参与者仍会继续处理该消息(执行评估)。它不会仅仅因为呼叫者超时而停止并转到下一条消息。只是想澄清一下,以防万一。

编辑

针对您关于停止长时间执行的评论,有一些与 Akka 相关的事情需要首先考虑。您可以调用停止actor,发送KillPosionPill,但如果处理当前正在处理的消息,这些都不会停止。他们只是阻止它接收新消息。在您的情况下,对于 Rhino,如果无限脚本执行是可能的,那么我建议在 Rhino 本身内处理这个问题。我会深入研究这篇文章 (Stopping the Rhino Engine in middle of execution) 上的答案,并在 Actor 中设置您的 Rhino 引擎,使其在执行时间过长时会自行停止。该失败将踢出到主管(如果被池化)并导致该池化实例重新启动,这将在preStart 中启动一个新的 Rhino。这可能是处理长时间运行脚本可能性的最佳方法。

【讨论】:

谢谢,这很有帮助。什么是迫使演员停止的最佳方式,因为我不希望我的线程建立处理潜在的无限脚本? @JPullar,围绕您的评论在我的回答中添加了更多信息

scala-unit7-scala并发编程模型akka

...一种高并发、分布式、并且容错的应用工具包;  Akka使用Scala语言编写,同时它提供了Scala和Java的开发接口,Akka可以开发一些高并发的程序。 二、Akka的Acor模型  A卡卡处理并发的方法基于actor模型,在基于actor的系统中... 查看详情

scala笔记整理:actor和akka(代码片段)

...现资源争用的情况,进而提升多线程编程的性能。Spark中使用的分布式多线程框架,是Akka,是Scala的一种多线程的类库。Akka也实现了类似ScalaActor的模型,其核心概念同样也是Ac 查看详情

scala笔记整理:actor和akka(代码片段)

...现资源争用的情况,进而提升多线程编程的性能。Spark中使用的分布式多线程框架,是Akka,是Scala的一种多线程的类库。Akka也实现了类似ScalaActor的模型,其核心概念同样也是Ac 查看详情

与 Scala / Akka Actor 相比,Java 线程有多重?

...alaactor与java线程的性能。我很惊讶地看到差异,我观察到使用我的系统我最多只能生成约2000个线程(一次运行)但使用相同的系统我能够生成约500,000个scala演员。两个程序 查看详情

一akka学习-actor

...kka用Scala语言写成,同时提供了Scala和JAVA的开发接口。Akka处理并发的方法基于Actor模型。在Akka里,Actor之间通信的唯一机制就是消息传递。二: 什么是Actor 查看详情

scala学习笔记-actor(19)

...还可以避免死锁等一系列传统多线程编程的问题。Spark中使用的分布式多线程框架,是Akka。Akka也实现了类似ScalaActor的 查看详情

scala框架akka学习(代码片段)

...Actor的关系Akka模型介绍Actor模型的优点Akka模型的核心概念如何创建Actor添加依赖在Akka中,Actor负责通信,在Actor中有一些重要的生命周期方法**akka的架构原理**创建Actor的步骤receive方法介绍ActorSystemactorOf方法actorOf方法的参... 查看详情

scala零基础教学90-101akka实战-深入解析

... actor中都有自己的成员,也有receive方法,在receive中处理具体的逻辑。 actor间沟通只能通过发消息。!发消息 查看详情

akka|helloakka(代码片段)

...基于Actor模型处理并发,提供了Java和Scala的API。下面总结如何基于SpringBoot搭建helloworld项目。第一步引入依赖,<properties><akka.version>2.6.10</akka.version><scala.bina 查看详情

Scala、Akka、Spray:如何在处理前验证 json 数据?

】Scala、Akka、Spray:如何在处理前验证json数据?【英文标题】:Scala,Akka,Spray:Howtovalidatejsondatabeforeprocessing?【发布时间】:2015-03-3117:29:31【问题描述】:当所有输入都有效时,我可以处理这个json,即使用有效的键(包括大小写)... 查看详情

Akka 的 Actor 与 Scala 的 Actor 模型有啥区别

】Akka的Actor与Scala的Actor模型有啥区别【英文标题】:What\'sthedifferenceoftheAkka\'sActorwithScala\'sActormodelAkka的Actor与Scala的Actor模型有什么区别【发布时间】:2012-03-1015:11:29【问题描述】:我发现还有一个AkkaActor模型,所以我想知道Akka... 查看详情

如何在 Akka 中监督 actor 并处理异常

】如何在Akka中监督actor并处理异常【英文标题】:HowtosuperviseactorsinAkkaandhandleexceptions【发布时间】:2021-11-2419:46:18【问题描述】:我正在尝试改进系统中参与者的错误处理。有时,在处理数据时出现问题,我需要停止并重新启动... 查看详情

scala学习并发编程模型akka(代码片段)

...nbsp;正文一,Akka简介  写并发程序很难。程序员不得不处理线程、锁和竞态条件等等,这个过程很容易出错,而且会导致程序代码难以阅读、测试和维护。Akka是JVM平台上构建高并发、分布式和容错应用的工 查看详情

flink之间的组件通信(代码片段)

...是netty。flink通过akka进行的分布式通信的实现,在0.9版本使用。使用akka,所有远程过程调用现在都实现为异步消息。RPC框架是flink任务运行的基础,flink整个RPC框架都是基于akka实现,并对akka中的actorsystem、actor进行了封装和使用... 查看详情

不同版本之间的 Akka 远程处理

...013-10-2216:18:03【问题描述】:我试图在不同的akka版本之间使用远程处理。我有一个在scala2.10.2上运行akka2.2.1的应用程序和一个在scala2.9.2上运行akka2.0.5的应用程序。第二个应用程序使用的库不适用于scala2.10.2,因此我不能简单地更... 查看详情

Scala 中的多个 Actor 实现有何不同?

...和Akka框架。现在,虽然Scala在其标准库中有演员,但Akka使用自己的实现。而且,如果我们寻找其他实现,我们还会发 查看详情

如何在没有 Akka 的情况下实现 Actor 模型?

】如何在没有Akka的情况下实现Actor模型?【英文标题】:HowtoimplementactormodelwithoutAkka?【发布时间】:2015-02-2319:34:15【问题描述】:如何在没有Akka的情况下实现简单的Actor?对于许多(非固定计数)actor实例、绿色线程、IoC(生命... 查看详情

(转)akka学习笔记

...Akka学习笔记:测试Actors》  《Akka学习笔记:Actor消息处理-请求和响应(1)》  《Akka学习笔记:Actor消息处理-请求和响应(2)》  《Akka学习笔记:Acto 查看详情