Akka如何联系集群中的远程角色

时间:2018-07-08 16:13:12

标签: scala akka akka-cluster akka-remote-actor

首先,我想对Akka和演员们来说我是个新手:)

我想创建一个分布式应用程序。我将把应用程序拆分为一个Web部件(REST API)和一个用户管理部件。但是从应用程序的另一部分访问角色的正确方法是什么?

我知道我可以通过提供演员的地址(https://doc.akka.io/docs/akka/2.5/remoting.html#looking-up-remote-actors)来访问演员选择,但是有没有办法不用我处理地址呢?

我只想创建一个系统,可以很容易地在不使用他们的地址的情况下联系到远程参与者。

2 个答案:

答案 0 :(得分:0)

也许您可以看看Distributed Publish Subscribe in Cluster

但是限制是:托管本地角色的本地角色系统和托管远程角色的远程角色系统应配置为akka cluster

如果集群可以作为您的设计,则可以执行以下操作:

远程部分:

class Subscriber extends Actor with ActorLogging {
  import DistributedPubSubMediator.{ Subscribe, SubscribeAck }
  val mediator = DistributedPubSub(context.system).mediator
  // subscribe to the topic named "content"
  mediator ! Subscribe("content", self)

  def receive = {
    case s: String ⇒
      log.info("Got {}", s)
    case SubscribeAck(Subscribe("content", None, `self`)) ⇒
      log.info("subscribing")
  }
}

本地部分:

class Publisher extends Actor {
  import DistributedPubSubMediator.Publish
  // activate the extension
  val mediator = DistributedPubSub(context.system).mediator

  def receive = {
    case in: String ⇒
      val out = in.toUpperCase
      mediator ! Publish("content", out)
  }
}

远程部分参与者订阅了content topic,如果本地部分想与远程对话,它可以将消息发布到content topic

希望它会给您一些想法。

答案 1 :(得分:0)

在集群分片中,角色标识为persistanceId,并且必须是发送给整个集群的消息的一部分。因此,您需要定义extractEntityId

阅读更多文档资料: https://doc.akka.io/docs/akka/2.5/cluster-sharding.html