gpt4 book ai didi

java - Akka 中重启 Actor 的消息持久化和回放

转载 作者:行者123 更新时间:2023-12-01 11:12:18 25 4
gpt4 key购买 nike

这里是 Akka Java。我有两个 Actor ,ParentChild,前者是后者的父级。如果 Child 抛出特定异常(例如 UnrulyTeenagerExcepton),那么我正在寻找的行为如下:

  • Parent 保存对抛出异常时 Child 正在处理的消息的引用;那么
  • Child 重启,持久化消息“回放”给 Child;但是
  • 如果此保存 -> 重新启动 -> 重放循环发生三次,并且 Child 抛出 UnrulyTeenagerException 三次,那么我们SupervisorStrategy.escalate()

迄今为止我最好的尝试:

// Groovy pseudo-code
class ChildFailureDecider extends Function<Throwable,Directive> {
int maxRetries = 3
int numRetries = 0

@Override
Directive apply(Throwable childFailure) {
if(childFailure instanceof UnrulyTeenagerException) {
numRetries++

if(numRetries <= maxRetries) {
// TODO: #1 How to persist the message that caused the ‘childFailure’?

return SupervisorStrategy.restart()

// TODO: #2 How to ‘play back’ the persisted message to Child?
}
}

SupervisorStrategy.escalate()
}
}

但正如你所看到的,我在消息持久化和回放方面遇到了困难。有任何想法吗? Java 代码示例非常感谢,Akka 已经足够强大,无需学习 Scala 象形文字!

最佳答案

Akka 持久性是指以持久的方式(例如到磁盘或数据库)记录事件(与消息不同),以便在整个应用程序终止时(例如 JVM 崩溃或硬件崩溃)失败),可以在重新启动时重建该参与者的状态。在您的情况下,您希望记住发送给单个参与者的消息,并在该参与者因故障而重新启动时重新发送该消息,因此我认为在这种情况下您不需要持久性 API。

当参与者抛出异常时,该异常会呈现给主管,但导致该异常的消息不会呈现给主管。我认为没有内置的方法可以实现这一目标。监管者可以通过设置适当参数的监管策略来管理只重启3次的规则:http://doc.akka.io/japi/akka/2.4-M3/akka/actor/OneForOneStrategy.html#OneForOneStrategy-int-scala.concurrent.duration.Duration-akka.japi.Function-

消息的重放需要由发送者处理。您可以通过让接收方在处理消息时向发送方发送确认来实现至少一次语义,并让发送方在未收到确认时定期重试。有关更多信息,请参阅此问题:Akka Message Delivery Guarantees

抱歉缺少代码,但我使用 Scala API 而不是 Java。

关于java - Akka 中重启 Actor 的消息持久化和回放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32214317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com