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

jgroups

嗨,您好,

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

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

例如,这可能是

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

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

jgroups

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【WebRTC---序篇】(二)Windows平台WebRTC源码编译

需要准备的东西 (一)一个强大的梯子(懂得都懂)!!!!!!!!! (二) 下载depot_tools Windows指定地址必须在此下载 打开这个页面,找 install depot_tools 这个关键字 请把他解压到C盘,并且设置到PATH环境变量种,且让它处于最顶端。 其他需要设置的额外变量 DEPOT_TOOLS_…

商品管理后台发布商品时,规格值组合的前端交互的实现逻辑

方案1&#xff1a;先计算总行数&#xff0c;再循环填充规格值 根据每种规格值数量计算得到总行数&#xff0c;如果下图有3种规格&#xff1a;长度、重量、大小&#xff0c;规格值个数分别为&#xff1a;3、3、2,3x3x218行。 规格种类有3种&#xff0c;于是写3层嵌套递归循环填…

python是什么牌子主机_python 收集主机信息

这篇文章是之前几篇的一个小综合。也是通过收集主机的一些参数信息&#xff0c;熟悉python里的文件读取&#xff0c;字符切割&#xff0c;字典存储等知识。文章结构&#xff1a;(1) 文章目的&#xff0c;需要收集的信息&#xff0c;并逐个分析如何获取信息。(2) 给出实现的pyth…

antlr idea 入门_ANTLR入门:构建简单的表达语言

antlr idea 入门这是该系列的第一篇文章。 本系列的目的是描述如何创建有用的语言和所有支持工具。 在本文中&#xff0c;我们将开始研究一种非常简单的表达语言。 我们将在语言沙箱中构建它&#xff0c;因此我们将其称为语言Sandy 。 我认为工具支持对于一种语言至关重要&am…

【WebRTC---源码篇】(五)WebRTC视频引擎

1. 视频数据的采集时间 2.视频分发器VideoBroadCaster

switch和toggle在软件开发中的含义和区别

switch和toggle这一对表示“切换”的单词&#xff0c;在计算机软件中我们能经常看到&#xff0c;很多时候口语中也会经常提及。但是&#xff0c;你想过它们之间有什么区别吗&#xff1f;没有区别&#xff1f;那你就大错特错了&#xff0c;区别还是很明显的&#xff0c;呵呵。 …

ios wkweb设置图片_iOS wkwebview和 uiwebview 内容图片自适应大小

- (void)webViewDidFinishLoad:(UIWebView *)webView {// 2、都有效果NSString *js"var script document.createElement(script);""script.type text/javascript;""script.text \"function ResizeImages() { ""var myimg,oldwidth;…

activiti异步执行_对基于消息队列的Activiti异步执行器进行基准测试

activiti异步执行一点历史 永无休止的一件事是&#xff0c;Activiti在某些非常大的规模的大型组织中的使用方式。 过去&#xff0c;这导致了各种优化和重构&#xff0c;其中包括异步执行器-替换旧的作业执行器。 对于未启动的用户&#xff1a;这些执行器在流程实例中处理计时器…

C++ 11 深度学习(十六)单例设计模式共享数据分析、解决,call_once

call_once std::call_once(参数一&#xff0c;参数二&#xff08;函数接口))的功能是保证一个函数只被调用一次&#xff0c;此方法具有互斥量的能力&#xff0c;并且消耗比互斥量少。此函数需要与标记std::once_flag配合使用&#xff0c;通过该标记决定函数是否调用&#xff0…

chrome浏览器设置网页快速到顶部和到底部的方法

鼠标移到浏览器的书签任意位置&#xff0c;点击鼠标右键添加书签&#xff0c;在添加书签的窗口输入名称和js代码&#xff0c;然后把书签移到浏览器书签栏的最左侧&#xff0c;这样每次浏览网页就可以使用快捷方式快速到底部或者顶部了。 快速到顶部的js代码&#xff1a;javascr…

ebp 函数堆栈esp_函数堆栈调用过程

从内存的角度详细的分析C语言中的函数调用过程&#xff1a;首先写一个测试用的代码&#xff1a;#include int add(int x, int y){int z 0;z x y;return z;}int main(){int a 1, b 2;int c 0;c add(a, b);return 0;}这是一个简单的的求和函数。其次&#xff0c;让我们确定…

apache pdfbox_Apache PDFBox命令行工具:无需Java编码

apache pdfbox在博客文章Apache PDFBox 2中 &#xff0c;我演示了将Apache PDFBox 2用作从Java代码中调用的库来操作PDF。 事实证明&#xff0c;Apache PDFBox 2还提供了可以直接从命令行直接使用的命令行工具 &#xff0c;而无需其他Java编码。 有几种命令行工具可用&#xff…

Java数组的学习

文章目录数组的声明和定义数组的特点如何使用数组数组的声明和定义 int[] ary new int[4] //动态初始化&#xff0c;长度4 int[] ary new int[]{1,2,3} //直接使用元素创建数组&#xff0c;也是动态初始化 int[] ary {1,2,3} //静态初始化// 数组变量的声明 int[] ary; in…

C++ 11 深度学习(十七)condition_variable、wait

简介 条件变量std::condition_variable的作用是阻塞线程&#xff0c;然后等待通知将其唤醒。我们可以通过某个函数判断是否符合某种条件来决定是阻塞线程等待通知还是唤醒线程&#xff0c;由此实现线程间的同步。所以简单来说condition_variable的作用就两个——等待(wait)、通…

【WebRTC---源码篇】(六)NACK判断包位置的关键算法

首先保证a与b不相等 template <typename T, T M = 0> inline bool AheadOf(T a, T b) {static_assert(std::is_unsigned<T>::value,"Type must be an unsigned integer.");return a != b && AheadOrAt<T, M>(a, b); } template <type…

spring集成mq_使用Spring Integration Java DSL与Rabbit MQ集成

spring集成mq我最近参加了在拉斯维加斯举行的2016年Spring大会 &#xff0c;很幸运地看到了我在软件世界中长期敬佩的一些人。 我亲自遇到了其中的两个人&#xff0c;他们实际上合并了几年前我与Spring Integration相关的一些次要贡献– Gary Russel和Artem Bilan &#xff0c;…

blt功能_BitBlt实现TransparentBlt

文章用BitBlt实现了TransparentBlt的功能&#xff0c;主要的工作如下&#xff1a;void TransparentBlt2(HDC hdcDest, // 目标DCint nXOriginDest, // 目标X偏移int nYOriginDest, // 目标Y偏移int nWidthDest, // 目标宽度int nHeightDest, // 目标高度HDC hdcSrc, // 源DCint…

MyEclipse 如何使用断点调试

文章目录1、在需要的代码行处打断点右键添加断点双击添加断点快捷键添加断点2、以debug模式开启服务器通过debug执行列表&#xff0c;选择服务器启动当前程序按右键&#xff0c;选择debug as&#xff0c;再选择服务器启动开发视图底部server列表选择服务器开启debug视图&#x…

【WebRTC---源码篇】(八)音频数据采集

ADM的创建 1.Audio Device Module是在逻辑层与硬件设备层之间进行了转换,需要使用什么功能,调用什么接口就可以,不要管底层平台实现。 2.AudioDeviceModule是一个接口类,定义了一系列接口。最终实现由子类AudioDeviceModuleForTest实现,其中包括一些测试函数(对设备的…

openlayers地图旋转_地图切换动画#openlayers入门笔记#

本博客合集是我的openlayers学习笔记&#xff0c;希望能帮助到刚开始接触openlayers的同学commnet 所用openlayers版本&#xff1a;v5.3.0commnet 阅读本文前需要对前端知识有一定的了解comment 本文内容只提供参考&#xff0c;建议结合openlayers官网的API和examples来学习com…