首先我想说,我对Akka和演员:)很陌生
我想创建一个分布式应用程序。我将应用程序拆分为 Web 部件 (REST API( 和用户管理部件。但是,从应用程序的另一部分访问Actor的正确方法是什么?
我知道我可以通过提供地址 (https://doc.akka.io/docs/akka/2.5/remoting.html#looking-up-remote-actors( 来访问演员选择,但是有没有一种方法我不必使用地址?
我只想创建一个系统,在不使用其地址的情况下可以轻松联系到远程参与者。
在集群分片中,参与者身份是persistanceId
的,并且必须是发送到整个集群的消息的一部分。这就是为什么您需要定义extractEntityId
.
在文档中阅读更多内容: https://doc.akka.io/docs/akka/2.5/cluster-sharding.html
也许你可以看看 分布式发布 在群集中订阅
但限制是:托管本地参与者的本地Actor系统和托管远程Actor的远程Actor系统应配置为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)
}
}
远程部分Actor订阅content topic
,如果本地部分想与远程通信,它可以直接发布消息给content topic
。
希望它能给你一些想法。