Akka 集群加入 DNS 负载均衡

Akka Cluster Joining with DNS Load Balancing

查看 akka cluster documentation 看来您必须知道至少 1 "seed node" 的服务器和端口值才能加入集群。 application.conf这个例子明确说明开发者在写文件的时候需要知道"host1"和"host2":

akka.cluster.seed-nodes = [
  "akka.tcp://ClusterSystem@host1:2552",
  "akka.tcp://ClusterSystem@host2:2552"]

但是,请考虑使用 DNS 负载平衡器注册每个集群节点的可能性。例如:可以实例化 10 个节点,这些节点都在名称 "foobar.cluster.com" 后面的负载均衡器中注册,这样负载均衡器会将每个新连接发送到 10 个节点循环方式之一。

然后我可以将种子节点设置为"akka.tcp://ClusterSystem@foobar.cluster.com:2552"吗?

换句话说,是否可以使用动态、负载平衡、名称来加入 akka 集群?

先验存在一个潜在问题:节点可能在第一次尝试时将自己作为种子节点。此问题的一个潜在解决方案是在 conf 文件中多次放置相同的种子节点值,以获得最终连接到不同节点的高概率:

akka.cluster.seed-nodes = [
  "akka.tcp://ClusterSystem@foobar.cluster.com:2552",
  "akka.tcp://ClusterSystem@foobar.cluster.com:2552",
  "akka.tcp://ClusterSystem@foobar.cluster.com:2552"]

但是 akka 可能只是将所有这些值减少到一个调用中,因为它们完全相同...

提前感谢您的考虑和回复。

可以,但是你得自己做DNS解析,然后编程加入集群。这在此处有所描述:http://doc.akka.io/docs/akka/current/scala/cluster-usage.html#Joining_to_Seed_Nodes

所以您首先需要配置文件包含 akka.cluster.seed-nodes = [] 以禁用自动加入。

然后您需要解析 foobar.cluster.com 以获得实际节点列表,即 01.foobar.cluster.com02.foobar.cluster.com、...

您将使用这些来加入集群:Cluster(system).joinSeedNodes(_list_of_nodes_with_port)

最后,记得当the hostname and port pair that Akka binds to will be different than the "logical" host name and port pair that is used to connect to the system from the outside. This requires special configuration