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