关键词:
【中文标题】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
后面汇集一堆RhinoActor
s,而不是每个请求都启动一个actor,每个实例都有自己的rhino 引擎,该引擎将在preStart
期间设置。这样做将消除每个请求的犀牛初始化成本,加快你的 js 评估。只要确保你的游泳池大小合适。此外,如果您采用这种方法,则无需为每个请求发送 PoisonPill
消息。
您可能还想查看非阻塞回调 onComplete
、onSuccess
和 onFailure
,而不是使用阻塞 Await
。这些回调也尊重超时,并且比阻塞更高的吞吐量更可取。只要上游等待此响应的任何方式都可以处理异步性(即支持异步的 Web 请求),那么我建议走这条路线。
最后要记住的是,即使代码会在超时后返回给调用者,如果参与者尚未响应,参与者仍会继续处理该消息(执行评估)。它不会仅仅因为呼叫者超时而停止并转到下一条消息。只是想澄清一下,以防万一。
编辑
针对您关于停止长时间执行的评论,有一些与 Akka 相关的事情需要首先考虑。您可以调用停止actor,发送Kill
或PosionPill
,但如果处理当前正在处理的消息,这些都不会停止。他们只是阻止它接收新消息。在您的情况下,对于 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 查看详情