草庐IT

java - Akka Java容错和Actor重新启动

coder 2024-03-07 原文

我目前正在研究Akka(Java版)中的容错和主管策略。

在... http://doc.akka.io/docs/akka/2.3.2/java/fault-tolerance.htmlhttp://doc.akka.io/docs/akka/2.3.2/general/supervision.html#supervision

几个问题:

1)当我们知道期望什么样的异常时,我们应该在 Actor 中使用try/catch块吗?为什么或者为什么不?如果不是,我们是否应该依靠监督者策略来有效处理 child 可能抛出的异常?

2)默认情况下,如果在父actor中没有显式配置任何 super 用户,则看起来任何抛出异常的子actor都会默认重启。如果您的整个系统中的参与者都没有处于状态,那该怎么办...我们真的应该重新启动吗?

3)如果您由system.actorOf(...)创建的顶级actor抛出异常怎么办?您如何在参与者系统之外提供主管策略?

4)让我们假设一个场景,其中 Actor A有一个子 Actor B。现在假设 Actor A要求 Actor B做一些工作。

一些代码可能看起来像这样:

Future<Object> future = Patterns.ask(child, message, timeout);
future.onComplete(new OnComplete<Object>() {

    @Override
    public void onComplete(Throwable failure, Object result) throws Throwable {
             ... handle here    
    }

现在...如果 Actor A以某种方式抛出异常该怎么办。默认情况下,它由其主管重新启动。问题是,onComplete“关闭”是否仍会在将来的某个时间执行,还是在重启时有效地“清除”了?

5)假设我有一个层次结构,例如:A-> B-> C。我们还假设我重写了preRestart,这样我就不会有效地停止我的 children 。在A的预启动中,他调用getContext()。actorOf(B),在B的预启动中,他调用getContext()。actorOf(C)。如果A抛出异常,系统中是否现在将存在一个以上的参与者B和一个以上的参与者C?

谢谢!

最佳答案

这将是一个很长的答案,但是让我尽可能有条不紊地解决您的问题。
另外,我将依赖Akka的官方文档,因为我认为Akka是迄今为止记录最好的项目之一,因此我不想重蹈覆辙。 :)

  • [1]是Akka中容错工作方式的一个很好的介绍/概述。我认为该文章很好地总结了Akka文档的几页。为了具体回应这一点,我认为这取决于:您可以try/catch异常,但是,错误内核模式指出,您应该“压低actor层次结构”任何可能失败的事物(这是为了防止或限制尽可能多的事情)尽可能避免参与者之间的状态丧失)。这就是说,如果您有一个非常具体的Exception,并且知道如何在处理邮件时将其处理,那么我认为捕获该邮件不会有任何内在问题。实际上,我可以想到至少一种特定的情况,即希望捕获异常并处理它们:如果您的 Actor 正在响应Pattern.ask,则您需要将异常包装在Failure中,以使通知调用者。 ([2])。
  • [3]中所述,默认行为的确是Restart,但是仅在消息处理期间抛出Exception的情况下。请注意,默认情况下,ActorInitializationExceptionActorKilledException将代替终止子项,并请记住,在Exception中抛出的任何preStart都将被包装在ActorInitializationException中。
    至于Restart是否是声音默认值,“如果您的actor中没有状态”……那么,根据定义,Actor是一种在并发环境中安全访问和操作状态的抽象方法:如果您没有没有状态,您不妨使用Future代替actor。通常,对于典型的用例,Restart被认为是安全合理的默认值。在您的特定情况下(这不是参与者系统的典型用例),无论如何您都可以覆盖默认的监督策略。
  • 仅从“用户”的角度来看,顶级参与者是顶级的。如 [4]中所述,任何顶级actor都将作为 Guardian actor的子代创建,并且具有正常的默认监管策略。另外,您可以使用属性akka.actor.guardian-supervisor-strategy修改此类默认值。
    另外,请记住,您应该始终在设计系统时牢记Akka的层次结构性质([5]),因此不要过多使用顶级参与者([6])。
  • 是否会调用onComplete的回调取决于A何时失败。如果在 B完成并响应A的请求后失败,则它可能会执行。否则它将不会。使用旧的A实例时,它被“清除”。
  • 这有点令人困惑,但我将假设以下内容:
  • 当您说“A引发异常”时,是指在消息处理(onReceive)内
  • 您的actor中有一个字段,该字段将存储getContext().actorOf(C)返回的引用。

  • 快速答案是:。根据您描述的场景,将存在BC的多个实例。但是,A的新实例将不知道这一点。它将引用新的B,并间接引用新的C。这是合理的并且是可以预期的,因为您手动设置了 ,而明确禁用了默认的清理逻辑,该逻辑用于处理actor层次结构中的失败(通过更改postRestart):现在是您的清理责任,您所描述的preStart实现不做。

    关于java - Akka Java容错和Actor重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23773175/

    有关java - Akka Java容错和Actor重新启动的更多相关文章

    1. ruby - 如何在续集中重新加载表模式? - 2

      鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

    2. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

      我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

    3. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    4. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

      最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

    5. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

      我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

    6. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    7. java - 我的模型类或其他类中应该有逻辑吗 - 2

      我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

    8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    9. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

      一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

    10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

      这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

    随机推荐