java - 这是 Akka 角色的正确用例吗?
问题描述
我正在更新一个 Akka 集群,其中特定参与者应该根据配置值在集群内的节点上启动。最初,我考虑使用自定义 Akka 集群角色并做了一些研究,阅读https://doc.akka.io/docs/akka/current/cluster-usage.html
提供此代码:
void register(Member member) {
if (member.hasRole("frontend"))
getContext()
.actorSelection(member.address() + "/user/frontend")
.tell(BACKEND_REGISTRATION, getSelf());
}
So I could use something like : if (member.hasRole("<MY_CUSTOM_ROLE>")) {
//Start My Actor
}
根据角色启动一个演员似乎不是 Akka 经典中角色的预期功能,因为在上面的示例中,演员没有被创建。而是根据路径将消息传递给另一个参与者。由于 Akka 经典中没有 spawn 方法,所以 Akka 经典中无法实现基于角色创建演员?
为角色键入的 Akka 似乎实现了我正在尝试实现的预期功能:
来自https://doc.akka.io/docs/akka/current/typed/cluster.html:
Member selfMember = Cluster.get(context.getSystem()).selfMember();
if (selfMember.hasRole("backend")) {
context.spawn(Backend.create(), "back");
} else if (selfMember.hasRole("front")) {
context.spawn(Frontend.create(), "front");
}
如果角色可用,这里会创建一个 Akka 角色。
当我使用经典 Actors 时,我正在考虑为 .yml 文件中的每个部署添加一个环境变量而不是 Akka“角色”,然后在启动所有 Akka Actor 的源代码中(如果为给定填充了环境变量)部署启动给定的actor,否则不启动actor。这是确定应该在集群中的每个节点上启动哪个参与者的可行解决方案吗?
解决方案
在 Akka Classic 中,你会有类似的东西
if (member.hasRole("<MY CUSTOM ROLE>")) {
Props props = ...
ActorRef ref = context.system().actorOf(props, "special-name") // spawn as a direct child of the ActorSystem
// or ...
ActorRef ref = context.actorOf(props, "special-name") // spawn as a child of this actor
}
在 Classic 中,您可以直接通过ActorSystem
.
推荐阅读
- x86 - 写入 PCI 内存映射寄存器会导致 CPU 无异常冻结吗?
- reactjs - 基于 Ionic v5 反应的启动应用程序 - 作为 chrome 扩展启动时出现空白屏幕
- plugins - Shopware 6 - 插件配置中的字段验证不起作用
- hyperledger-fabric - Hyperledger Fabric 中通过排序服务进行交易排序的标准
- jsp - 从 JSP 表达式标记访问 JSTL 变量
- python - 运行 SQL Server SP 时光标状态无效
- machine-learning - 如何基于相似性对大型数据集进行聚类?
- firebase - Firestore 中的路径
- spring-boot - spring-boot:build-image 与 jib 有什么区别?
- r - 将一个文件合并到R中的多行