【问题标题】:Is there a way to get predictable actor naming with Akka-Stream?有没有办法使用 Akka-Stream 获得可预测的演员命名?
【发布时间】:2015-04-06 17:53:47
【问题描述】:

我使用 ActorPublisher 作为 Akka-Stream Source。我不知道如何以可预测的方式命名输入参与者,以便我可以从我的应用程序的其他部分向它发送消息。我正在像这样实例化我的源代码:

val src = Source[Task](Props(classOf[TaskListener], this), "task-listener")

当我实现流时,我得到一个ActorRef,但它的路径是动态生成的,它只使用我提供的名称作为代码生成的以流为中心的命名方案的一部分。

有什么方法可以让这个前端演员源有一个明确的名字,还是我一直在传递 ActorRef ?

如果我不能明确命名它,这是否意味着您不能直接使用 Akka-Stream 进行远程处理?

编辑:我现在可以使用相对路径找到我的演员,但我仍然需要弄清楚如何命名我的Flow,这样我才能了解相关演员的完整路径将是什么是。

编辑:(下面的 akka 版本信息,scala 2.11.6)

"com.typesafe.akka" %% "akka-actor" % "2.3.9"
"com.typesafe.akka" %% "akka-stream-experimental" % "1.0-M4"

编辑: akka-user google 小组的友好人士启发了我,并建议处理此问题的正确方法是传递由 @ 产生的 ActorRef 987654328@ 调用自身而不使用.actorSelection()。如果我发现这种情况在未来发生变化,我会更新这个问题。感谢阅读。

【问题讨论】:

  • 我知道 3 年多过去了,但你能否分享一下你最后处理这个问题的方式,因为我在做同样的任务
  • @YoZH 我使用Source.actorPublisher 创建了一个Source,然后创建了一个Flow,我在其上调用了flow.runWith(src)——但该方法已被弃用。希望您现在已经解决了这个问题。

标签: scala akka akka-stream


【解决方案1】:

解决这个问题的好方法是添加具有特定路径的组路由器,然后你可以告诉路由器它可以在哪里找到你的演员(routees)。

通过这样做,您将解耦具体的参与者组,并通过路由器保持到源池的单点入口。此外,您将来还可以让这个路由器集群知道。

您还可以查看 ActorFlowMaterializer - http://doc.akka.io/api/akka-stream-and-http-experimental/1.0-M5/index.html#akka.stream.ActorFlowMaterializer 本身。您可以在源代码中找到此注释:

/** The `namePrefix` is used as the first part of the names of the actors running
  * the processing steps. The default `namePrefix` is `"flow"`. The actor names are built up of
  * `namePrefix-flowNumber-flowStepNumber-stepName`.
  */
def create(settings: ActorFlowMaterializerSettings, context: ActorRefFactory, namePrefix: String): ActorFlowMaterializer =
apply(Option(settings), Option(namePrefix))(context)

【讨论】:

  • 这是一种抽象演员的好方法,但我需要的是能够从路径中解析演员。为此,您的解决方案与共享 ActorRef 没有什么不同。但无论如何都是好的想法。
  • 另一种解决方案是向您的 ActorSelection 下的演员发送识别消息,并收听包含 ActorRef 的 ActorIdentity 回复。如果您愿意,您也可以创建自定义消息。据我所知,Flow 会将您的名字作为前缀,例如 task-listener*.
  • 另外关于命名,如果你使用 ActorFlowMaterializer,你可以看到actors是如何命名的,并且你可以通过向 Materializer 本身提供你的自定义前缀来控制这个actors的前缀。在这里查看更多信息 - doc.akka.io/api/akka-stream-and-http-experimental/1.0-M5/…
  • 演员名由*namePrefix-flowNumber-flowStepNumber-stepName组成。
  • 我已经走上了 Materializer 路线,结果是它不会影响顶级监督名称,而只会影响动态创建的 Actor 上的前缀。 YoK,在您的示例中,动态命名的演员上方仍然会有 $a 或类似的东西。
猜你喜欢
  • 2019-07-26
  • 2017-02-15
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多