【问题标题】:Supervise Any Non-Child Actor?监督任何非儿童演员?
【发布时间】:2015-10-16 11:29:22
【问题描述】:

这个要求可能听起来很奇怪,或者我不确定如何解决这个问题,我在这里尽我所能用下图解释

  • 我有一个作为单个进程运行的现有应用程序 (Legacy Application)。
  • Legacy Application 对 java 版本、slf4j、spring 等有非常老的依赖。
  • 为了使其具有容错性并为其添加一些监督,我将其包装在 Akka Actor 中,并在不同的 JVM 和 Actor 系统中远程启动。
  • 我从我的新应用程序启动这个旧版应用程序为

processor = context.actorOf(Props[Processor], "processor")

我的配置看起来像

deployment {
      /newApplication/processor/ {
        remote = "akka.tcp://ProcessingSystem@127.0.0.1:2552"
      }

但由于Processor 具有所有旧依赖项,我也将它们放入我的新系统中:(

我在寻找什么?
- 有没有办法可以在 ActorSystem(和 JVM)中启动遗留应用程序,它可以被封装,但在新应用程序中有主管?

底线:我希望旧的依赖不泄漏,但由于其他 JVM 可以抛出 OOM,我想从外部监督(新 ActorSystem)

【问题讨论】:

  • 说到依赖,是指sbt库依赖吗?您是否将包括遗留应用程序在内的全部内容捆绑在一个项目中?
  • legacyApplication 被捆绑为一个大罐子,里面还有其他依赖项

标签: java scala akka typesafe typesafe-stack


【解决方案1】:

关于依赖关系,只需使用 Group Router,它通过 ActorSelection 发送消息,并且不需要在发送者端存在目标类。但是此路径上的 Actors 的存在不受 Group Router 管理。更多详情请访问:http://doc.akka.io/docs/akka/2.4-M2/scala/remoting.html

akka.actor.deployment {
  /parent/remoteGroup {
    router = round-robin-group
      routees.paths = [
        "akka.tcp://app@10.0.0.1:2552/user/workers/w1", 
        "akka.tcp://app@10.0.0.2:2552/user/workers/w1",
        "akka.tcp://app@10.0.0.3:2552/user/workers/w1"]
      }
}

关于监督:只需从路径(在组路由器中使用)解析 ActorSelection(resolveOne 方法调用)并将ActorRef 对象添加到新应用程序中演员的context.watch,然后处理Terminated 消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多