JGroups:无需额外基础架构的领导人选举

嗨,您好,

在这篇文章中,我将展示如何在不使用任何其他基础架构(例如Apache ZookeeperConsul)的情况下解决领导人选举的问题。

领导者选举是解决以下问题的一种常见方法:在分布式系统中,只有一个实例必须完成特定工作。

例如,这可能是

  • 触发计划的工作
  • 当系统充当外部系统的客户端时,协调建立连接
  • 运行清理任务

通常,这可以通过使用提到的或类似的基础结构来解决。 但是,如果您不想将它们引入系统环境,则还有另一种方法: JGroups

JGroups是一个

用于可靠消息传递的工具包。 它可用于创建其节点可以相互发送消息的集群。
[http://jgroups.org/]

使用JGroups设置领导者,可以通过使用JGroups的View概念非常容易地进行选举。

视图是关于群集状态的实际视图(猜测是什么)。 由于每个集群都只有一个协调器,即视图中成员列表的第一个成员,因此该协调器可以解释为集群的领导者。

如果领导者死亡/重新启动/出现故障,列表中的下一个成员将成为新领导者。 这是一种非常方便且确定性的方法。

让我们看一些非常简单的代码,演示一下:

public class JGroupsLeaderElectionExample {
 
  private static final int MAX_ROUNDS = 1_000;
  private static final int SLEEP_TIME_IN_MILLIS = 1000;
 
  public static void main(String[] args) throws Exception {
    JChannel channel = new JChannel();
    channel.connect("The Test Cluster");
    for (int round = 0; round < MAX_ROUNDS; round++) {
      checkLeaderStatus(channel);
      sleep();
    }
 
    channel.close();
  }
 
  private static void sleep() {
    try {
      Thread.sleep(SLEEP_TIME_IN_MILLIS);
    } catch (InterruptedException e) {
      // Ignored
    }
  }
 
  private static void checkLeaderStatus(JChannel channel) {
    View view = channel.getView();
    Address address = view.getMembers()
                          .get(0);
    if (address.equals(channel.getAddress())) {
      System.out.println("I'm (" + channel.getAddress() + ") the leader");
    } else {
      System.out.println("I'm (" + channel.getAddress() + ") not the leader");
    }
  }
}

上面的代码使用默认的堆栈设置创建一个新的JChannel。 也可以使用XML文件或编程方法来配置堆栈。
然后将通道连接到“测试群集” 。 JGroups通过在连接上广播发现集群。 如果当前实例是第一个,它将创建集群。

在循环中,代码现在仅从通道获取实际视图,并检查实际实例是否也是第一个成员。 您记得第一位成员可以被视为领导者。

如果现在启动多个实例并停止第一个实例,则第二个将接管。 像这个例子:

-------------------------------------------------------------------
GMS: address=Ygdrassil-21922, cluster=The Test Cluster, physical address=2003:4e:a904:2d67:55c:2653:7e28:8634:59721
-------------------------------------------------------------------
I'm (Ygdrassil-21922) the leader
I'm (Ygdrassil-21922) the leader
I'm (Ygdrassil-21922) the leader
I'm (Ygdrassil-21922) the leader
-------------------------------------------------------------------
GMS: address=Ygdrassil-57947, cluster=The Test Cluster, physical address=2003:4e:a904:2d67:55c:2653:7e28:8634:59724
-------------------------------------------------------------------
I'm (Ygdrassil-57947) not the leader
I'm (Ygdrassil-57947) not the leader
I'm (Ygdrassil-57947) not the leader
I'm (Ygdrassil-57947) not the leader
I'm (Ygdrassil-57947) not the leader
I'm (Ygdrassil-57947) the leader
I'm (Ygdrassil-57947) the leader

像往常一样,可以在我的GitHub帐户上找到该代码。

摘要

在本文中,我们了解了如何在不引入任何其他基础结构的情况下设置领导者选举。 JGroups提供了很多有趣的东西,例如分布式计数器,分布式任务执行等。

翻译自: https://www.javacodegeeks.com/2016/06/jgroups-leader-election-without-additional-infrastructure.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值