当前位置: 首页 > 知识库问答 >
问题:

Akka集群单例创业的正确道路是什么

商嘉木
2023-03-14
    null
10:52:41.691UTC INFO  akka.tcp://system@127.0.0.1:9401/user/singletonOfEvents - ClusterSingletonManager state change [Start -> Younger]

我看到“singleton actor总是在具有指定角色的最老成员上运行。”在Akka集群中,单例Doc。但我不明白singleton是怎么开始的。也许所有的单例都必须在第一个种子节点中实现和启动?

共有1个答案

壤驷坚
2023-03-14

如Akka文档中所述,集群单例参与者实例由每个集群节点上的ClusterSingletonManager参与者启动和维护,该参与者具有为单例指定的角色。ClusterSingletonManager在任何时间点以指定的角色在集群的最早节点上最多维护一个单例实例。如果最老的节点(可能是第一个种子节点)失败,将选择下一个最老的节点。若要访问集群单例参与者,请使用ClusterSingletonProxy,它存在于具有指定角色的所有节点上。

下面是启动集群单例的示例应用程序的样子:

object Main {

  def workTimeout = 10.seconds

  def main(args: Array[String]): Unit = {
    // Validate arguments host and port from args(0) and args(1)
    // ...

    val role = "worker"

    val conf = ConfigFactory.parseString(s"akka.cluster.roles=[$role]").
      withFallback(ConfigFactory.parseString("akka.remote.netty.tcp.hostname=" + host)).
      withFallback(ConfigFactory.parseString("akka.remote.netty.tcp.port=" + port)).
      withFallback(ConfigFactory.load())

    val system = ActorSystem("ClusterSystem", conf)

    system.actorOf(
      ClusterSingletonManager.props(
        Master.props(workTimeout),
        PoisonPill,
        ClusterSingletonManagerSettings(system).withRole(role)
      ),
      name = "master"
    )

    val singletonAgent = system.actorOf(
      ClusterSingletonProxy.props(
        singletonManagerPath = "/user/master",
        settings = ClusterSingletonProxySettings(system).withRole(role)
      ),
      name = "proxy"
    )

    // ...
  }

  // ...
}

object Master {
  def props(workTimeout: FiniteDuration): Props =
    Props(classOf[Master], workTimeout)

  // ...
}

class Master(workTimeout: FiniteDuration) extends Actor  {
  import Master._

  // ...
}

群集配置可能如下所示:

akka {

  actor.provider = "akka.cluster.ClusterActorRefProvider"

  remote.netty.tcp.port = 0
  remote.netty.tcp.hostname = 127.0.0.1

  cluster {
    seed-nodes = [
      "akka.tcp://ClusterSystem@10.1.1.1:2552",
      "akka.tcp://ClusterSystem@10.1.1.2:2552"
    ]

    auto-down-unreachable-after = 10s
  }

  // ...
}
 类似资料:
  • 我运行“Storm杀死拓扑-名称”杀死拓扑,但之后有干净的方法关闭工人,光轮,监督员和UI吗? 我没有在文档中找到任何与此对应的命令:https://github.com/nathanmarz/storm/wiki/command-line-client

  • 我是AWS Elasticache redis的新手,我在endpoint以下。 我对使用Jedis和Redisson感到困惑,因为两者都提供单连接和群集连接类。 就像在Jedis,对于一个单一的连接,我们可以使用: 对于集群连接,我们使用: 当我想使用Redisson时,这些选项也会出现。我不想比较这两个库,我的问题是:当你只有一个endpoint,仍然可以利用AWS自动缩放功能时,哪一个是连接

  • 我试图学习Akka集群下面的教程提供了这里 我已经创建了应用程序和回购是在这里。 正如教程中提到的,我已经启动了FrontEndApp 即使我在2551和2552上启动后端应用程序,上述警告消息也会不断重复。 在2551上启动后端参与者的终端日志。 最后一个日志持续重复。 在2552上启动后端参与者的终端日志。 不确定是什么原因群集节点不能检测到彼此和参与者节点与后端。 我会错过任何设置吗?

  • 我对Akka坚持的适用性一团糟,坚持的演员,当我应该使用一个坚持的演员? 以给定购物应用程序的购物车模块为例,每个用户的购物车会话是否都是具有各自唯一persistenceID的持久参与者? 在实际应用中的可用性如何?查询端如何处理持久执行元的状态?当持久执行元在实际应用中并不有用时? 存储状态还是存储消息,是一回事吗?不是吗?有什么区别,什么时候我该用每一个? 有人能给我举几个例子吗?