`
phantom
  • 浏览: 164908 次
社区版块
存档分类
最新评论

JavaGroups—构建分布式通信的基础(上)

阅读更多

 

JavaGroups—构建分布式通信的基础(上)

    JavaGroups 是一种可靠组通信工具,在同一个台主机、局域网甚至是广域网中,组成员可以加入一个组,发送消息给其它的组成员并从其它成员中接收消息,系统跟踪所有组成员加入、退出和崩溃,并将这些系统信息发送给其它组成员。在JavaGroups中,组并不需要明确地创建,当第一个成员加入一个组时,自动创建了该组,第一个成员同时作为系统的协调者统一发送系统信息(譬如成员的加入退出等)给其它成员,而其他组成员通过与系统协调者的通信来获得系统的变化情况。目前大部分开源的分布式缓存的底层都是基于JGroups,包括鼎鼎大名的JBossCache、OSCache等等。

     上图为JavaGroups的概念架构图。可以看出,JavaGroups从概念上自下而上分为三个部分,协议栈、通道(Channel接口)、 BuildingBlocks And DistributedDataStructures (高层组件和分布式数据结构)和应用程序。其中,通道、高层组件和分布式数据结构是系统暴露出来的接口,用户应用程序通过与该部分的交互来使用底层的通信功能。以下将分别对各部分进行详细介绍。
     协议栈是系统最核心的部分,其定义了组成员之间如何通信、协调,组如何初始化,组如何检测成员等等最核心和根本的功能。协议栈是一些有顺序的协议的组合,当通道发送一条消息时,首先将其传递给协议栈(Protocol stack),协议栈将其传递给最顶端的协议处理,每个协议处理完之后将其传递给其底端协议处理,最后,最底端的协议将消息通过网络将其传送出去。
    下图是一个协议堆例子,其中:CAUSAL协议定义了一个组成员顺序发送出去的消息必须按相同的顺序被其它的组成员所接受;GMS协议定义了组管理服务,包括成员的加入、离开和崩溃的处理;MERGE协议定义了子组的合并,即协调者定期广播一些HELLO和地址信息,如果接受到回应和其组名一致并且目前还没加入本组,则将其合并进来;FRAG定义了消息分桢机制,即当一个消息超过一定大小的时候将其分解为几个小消息发送;UDP定义了底层的传送机制。协议栈灵活的定义机制使用户可以灵活地根据自己的需求来定义使用的协议栈。

    下面列出一些常用的协议的作用:
    1)核心微协议
CAUSAL:组中消息的原因排序。实现使用一个矢量时钟
FD:使用 heartbeat 协议的故障检测。根据成员关系列表中的排序,Heartbeat 消息被发送到邻居成员
FD_SOCK:基于 TCP 套接字的故障检测。基于环 的 ping 被在邻居成员之间发送。当所有成员都在同一物理主机上时工作得最好
FD_PID: 使用进程 ID 的故障检测 (本地 JNI 代码,以获得所需的 PID)。只能在同一台主机上 (一个 IP 地址) 工作
FD_PROB: 使用随机算法的故障检测。组的每个成员发送 heartbeat,并维护其他成员的 heartbeat 计数
FLOW_CONTROL:流控制实现,限制了消息收据之间发送的消息的最大数量
FLUSH:以一致的方式跨所有成员清除所有的消息。通常是在视图更改之前执行
FRAG:消息分段和重新装配(Message fragmentation and reassembly)。确保较大的消息在沿着栈往下发送之前被分为 
FRAG_SIZE:大小的段。分段的消息在沿着栈往上发送之前在接收方被重新装配
GMS:组管理服务。基于虚拟同步模型管理组成员关系
MERGEMERGE2:合并分离的子组。当网络由于故障而分离成多个部分时就形成了子组
NACKACK:实现可靠的传输。基于消息序列号请求丢失消息的重新传输。确保从每个起始通道发出的消息的正确排序JMS将 Java Message Service 用于传输。与任何 JMS 实现协同工作
STATE_TRANSFER: 实现状态传输协议,使得新成员可以从同等物(coordinator)或所有成员获得现有的状态。需要 FLUSH 微协议在协议栈上
UNICAST:实现可靠的单播传输。请求丢失消息的重新传输,并确保发出消息的正确排序
VIEW_ENFORCER:直到接收到第一个 
VIEW_CHANGE: 才丢弃消息。客户端只有在成为组成员后才需要处理消息
STABLE:实现分布式的垃圾收集协议 (也就是说,删除所有已被所有组成员接收到的消息)
VERIFY_SUSPECT:发送消息以确保以前怀疑的成员已真正崩溃(crashed)
UDP:一般用作组消息传输的最低层。IP 多播用于组广播,而 UDP 用于点到点通信PING:用于引导成员关系管理。使用 IP 多播 "ping" 消息来定位成员,然后再请求这      
些成员加入组中
    2)基于随机广播的微协议
pbcast.GMS:组管理服务,基于随机广播 (杂谈)。不需要 FLUSH
pbcast.FD:基于杂谈(gossip) 的被动故障检测。不发送 heartbeat 消息
pbcast.PBCAST:实现随机广播,有规律地以杂谈的方式发送到成员关系的一个随机子集
pbcast.STABLE:实现分布式的垃圾收集协议 (也就是说,删除所有已被所有组成员接收到的消息)
pbcast.NAKACK:对丢失消息的重新传输和消息的顺序传送的否认实现pbcast.STATE_TRANSFER:将随机广播用于状态传输实现。不需要 QUEUE
    3)穿越 WAN 和防火墙的微协议
TCP :用于取代 UDP 作为最低层传输。通过 TCP 连接发送多个单播消息到成员,而不是发送多播消息 (不可能)。已经内置了可靠性、FIFO 排序和流控制
TCPPING:使用一组已知的成员来引导通过 TCP 的成员关系管理
TCPGOSSIP:使用一个外部杂谈 (参见 参考资料) 服务器,来为成员关系管理的引导定位成员的初始集合 
TUNNEL: 当用于代替 UDP 或 TCP 作为最低层传输协议时,启用通过防火墙的隧道技术。与防火墙外的一个 JavaGroups Router 进程协同工作
    JavaGroups中所有的协议都在org.jgroups.protocol包及其自包中定义,各协议详细的定义和实现可参见源代码。
     通道类似于Socket,用户通过通道与底层的交互,使用编程更加方便。通道相当于一个组的句柄,对用户而言,组通信最核心的功能是加入组、退出组、发送消息、接收消息,都通过通道来达到这个目的,即org.jgroups.Channel的实现。值得注意的是,JavaGroups中Channel仅是一个抽象类,可以使用不同的通道实现,见下图:

    在这里我们仅探讨最常用的org.jgroups.Jchannel实现。
    1)指定协议栈并创建通道,并连接到一个组
以下内容为程序代码:

String props = "UDP(mcast_addr=228.8.8.8;mcast_port=45566;ip_ttl=32;"
   + "mcast_send_buf_size=64000;mcast_recv_buf_size=64000):"
   + "PING(timeout=2000;num_initial_members=3):"
   + "MERGE2(min_interval=5000;max_interval=10000):"
   + "FD_SOCK:"
   + "VERIFY_SUSPECT(timeout=1500):"
   + "pbcast.NAKACK(max_xmit_size=8096;gc_lag=50;retransmit_timeout=600,1200,2400,4800):"
   + "UNICAST(timeout=600,1200,2400,4800):"
   + "pbcast.STABLE(desired_avg_gossip=20000):"
   + "FRAG(frag_size=8096;down_thread=false;up_thread=false):" 
+ "pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;"
   + "shun=false;print_local_addr=true):" + "STATE_TRANSFER:QUEUE";
JChannel channel = new JChannel(props);
channel.connect(“groupname”);

     2)发送一条消息
以下内容为程序代码:

channel.send(new Message(null, null, “Hello, JavaGroups”);

     3)接受一条消息
以下内容为程序代码:

Object obj = channel.receive(0); 

     4)退出组
以下内容为程序代码:

channel.close();

     可以通过设置通道的一些选项来定义通道的行为
     public void setOpt(int option, Object value)
     目前有效的值分别是
     1)Channel.BLOCK:是否接受阻塞信息,默认为Boolean.TRUE
     2)Channel.LOCAL:消息广播时,消息发送者是否也会接受到该消息,默认为Boolean.TRUE
     3)Channel.AUTO_RECONNECT:通道断开时是否自动重连接,默认值为Boolean.TRUE
     4)Channel.AUTO_GETSTATE:是否自动重新获得状态信息,默认值为Boolean.TRUE
     系统以及组成员之间通过消息的方式来进行通信,消息分为如下几种(以下说明的类位于org.jgroups包下):
     1)普通消息(Message类)
     用户组成员之间的交互消息,包括消息头、消息接受者、消息发送者和消息体
     2)视图(View类)
     即组成员的情况,当一个成员加入、退出或者崩溃时,系统协调者(见上,第一个组成员)向其它发送新的视图信息
     3)疑似事件(SuspectEvent类)
     当检测到一个组成员可能已经离开或者崩溃时,发送该信息。
     4)阻塞事件(BlockEvent类)
     当系统协调者在更新视图时,会发送该阻塞信息给其它组成员,让其在视图更新之后再做发送消息的操作
     5)获得状态事件(GetStateEvent类)
     6)设置状态事件(SetStateEvent类)
     应用程序可能需要保持一些状态,并在各个成员之间同步,可以通过这两个事件知晓状态的变化
     就此,我们已经对JavaGroups的架构和组件有一个基本的了解,下部分将通过例子进一步介绍JavaGroups的使用
分享到:
评论

相关推荐

    GroupCo基础服务提供者.java版本.可以与GroupCo服务层无缝切换.rar

    JavaGroups—构建分布式通信的基础(上) JavaGroups 是一种可靠组通信工具,在同一个台主机、局域网甚至是广域网中,组成员可以加入一个组,发送消息给其它的组成员并从其它成员中接收消息,系统跟踪所有组成员...

    java毕业设计论文java简介

    在毕业设计中,利用JavaGroups构建系统,可以实现高效、可靠的组通信功能,对于分布式系统或者需要多节点协作的项目尤为适用。通过深入理解Java的核心特性和JavaGroups的机制,学生可以构建出高效、稳定且跨平台的...

    jgroup代码

    JGroups是一个高性能、可扩展且易于使用的分布式通信库,用于实现集群中的节点之间的消息传递。它支持多种传输层协议,如UDP、TCP等,并提供了一系列高级特性,比如组播、广播、心跳检测以及故障恢复机制等。通过...

    《数据结构》(02331)基础概念

    内容概要:本文档《数据结构》(02331)第一章主要介绍数据结构的基础概念,涵盖数据与数据元素的定义及其特性,详细阐述了数据结构的三大要素:逻辑结构、存储结构和数据运算。逻辑结构分为线性结构(如线性表、栈、队列)、树形结构(涉及根节点、父节点、子节点等术语)和其他结构。存储结构对比了顺序存储和链式存储的特点,包括访问方式、插入删除操作的时间复杂度以及空间分配方式,并介绍了索引存储和散列存储的概念。最后讲解了抽象数据类型(ADT)的定义及其组成部分,并探讨了算法分析中的时间复杂度计算方法。 适合人群:计算机相关专业学生或初学者,对数据结构有一定兴趣并希望系统学习其基础知识的人群。 使用场景及目标:①理解数据结构的基本概念,掌握逻辑结构和存储结构的区别与联系;②熟悉不同存储方式的特点及应用场景;③学会分析简单算法的时间复杂度,为后续深入学习打下坚实基础。 阅读建议:本章节内容较为理论化,建议结合实际案例进行理解,尤其是对于逻辑结构和存储结构的理解要深入到具体的应用场景中,同时可以尝试编写一些简单的程序来加深对抽象数据类型的认识。

    【工业自动化】施耐德M580 PLC系统架构详解:存储结构、硬件配置与冗余设计

    内容概要:本文详细介绍了施耐德M580系列PLC的存储结构、系统硬件架构、上电写入程序及CPU冗余特性。在存储结构方面,涵盖拓扑寻址、Device DDT远程寻址以及寄存器寻址三种方式,详细解释了不同类型的寻址方法及其应用场景。系统硬件架构部分,阐述了最小系统的构建要素,包括CPU、机架和模块的选择与配置,并介绍了常见的系统拓扑结构,如简单的机架间拓扑和远程子站以太网菊花链等。上电写入程序环节,说明了通过USB和以太网两种接口进行程序下载的具体步骤,特别是针对初次下载时IP地址的设置方法。最后,CPU冗余部分重点描述了热备功能的实现机制,包括IP通讯地址配置和热备拓扑结构。 适合人群:从事工业自动化领域工作的技术人员,特别是对PLC编程及系统集成有一定了解的工程师。 使用场景及目标:①帮助工程师理解施耐德M580系列PLC的寻址机制,以便更好地进行模块配置和编程;②指导工程师完成最小系统的搭建,优化系统拓扑结构的设计;③提供详细的上电写入程序指南,确保程序下载顺利进行;④解释CPU冗余的实现方式,提高系统的稳定性和可靠性。 其他说明:文中还涉及一些特殊模块的功能介绍,如定时器事件和Modbus串口通讯模块,这些内容有助于用户深入了解M580系列PLC的高级应用。此外,附录部分提供了远程子站和热备冗余系统的实物图片,便于用户直观理解相关概念。

    某型自动垂直提升仓储系统方案论证及关键零部件的设计.zip

    某型自动垂直提升仓储系统方案论证及关键零部件的设计.zip

    2135D3F1EFA99CB590678658F575DB23.pdf#page=1&view=fitH

    2135D3F1EFA99CB590678658F575DB23.pdf#page=1&view=fitH

    agentransack文本搜索软件

    可以搜索文本内的内容,指定目录,指定文件格式,匹配大小写等

    Windows 平台 Android Studio 下载与安装指南.zip

    Windows 平台 Android Studio 下载与安装指南.zip

    Android Studio Meerkat 2024.3.1 Patch 1(android-studio-2024.3.1.14-windows-zip.zip.002)

    Android Studio Meerkat 2024.3.1 Patch 1(android-studio-2024.3.1.14-windows.zip)适用于Windows系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/90557033 part2: https://download.csdn.net/download/weixin_43800734/90557035

    4-3-台区智能融合终端功能模块技术规范(试行).pdf

    国网台区终端最新规范

    4-13-台区智能融合终端软件检测规范(试行).pdf

    国网台区终端最新规范

    【锂电池剩余寿命预测】Transformer-GRU锂电池剩余寿命预测(Matlab完整源码和数据)

    1.【锂电池剩余寿命预测】Transformer-GRU锂电池剩余寿命预测(Matlab完整源码和数据) 2.数据集:NASA数据集,已经处理好,B0005电池训练、B0006测试; 3.环境准备:Matlab2023b,可读性强; 4.模型描述:Transformer-GRU在各种各样的问题上表现非常出色,现在被广泛使用。 5.领域描述:近年来,随着锂离子电池的能量密度、功率密度逐渐提升,其安全性能与剩余使用寿命预测变得愈发重要。本代码实现了Transformer-GRU在该领域的应用。 6.作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。

    基于android的家庭收纳App的设计与实现.zip

    Android项目原生java语言课程设计,包含LW+ppt

    大学生入门前端-五子棋vue项目

    大学生入门前端-五子棋vue项目

    二手车分析完整项目,包含源代码和数据集,包含:XGBoost 模型,训练模型代码,数据集包含 10,000 条二手车记录的数据集,涵盖车辆品牌、型号、年份、里程数、发动机缸数、价格等

    这是一个完整的端到端解决方案,用于分析和预测阿联酋(UAE)地区的二手车价格。数据集包含 10,000 条二手车信息,覆盖了迪拜、阿布扎比和沙迦等城市,并提供了精确的地理位置数据。此外,项目还包括一个基于 Dash 构建的 Web 应用程序代码和一个训练好的 XGBoost 模型,帮助用户探索区域市场趋势、预测车价以及可视化地理空间洞察。 数据集内容 项目文件以压缩 ZIP 归档形式提供,包含以下内容: 数据文件: data/uae_used_cars_10k.csv:包含 10,000 条二手车记录的数据集,涵盖车辆品牌、型号、年份、里程数、发动机缸数、价格、变速箱类型、燃料类型、颜色、描述以及销售地点(如迪拜、阿布扎比、沙迦)。 模型文件: models/stacking_model.pkl:训练好的 XGBoost 模型,用于预测二手车价格。 models/scaler.pkl:用于数据预处理的缩放器。 models.py:模型相关功能的实现。 train_model.py:训练模型的脚本。 Web 应用程序文件: app.py:Dash 应用程序的主文件。 callback

    《基于YOLOv8的船舶航行违规并线预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    《基于YOLOv8的工业布匹瑕疵分类系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    CodeCount.exe

    此为代码审查工具 可查 文件数,字节数,总行数,代码行数,注释行数,空白行数,注释率等

    商业数据分析与Python实现:企业破产概率及抽样技术解析(复现论文或解答问题,含详细可运行代码及解释)

    内容概要:本文档涵盖了一项关于企业破产概率的详细分析任务,分为书面回答和Python代码实现两大部分。第一部分涉及对业务类型和破产状态的边际分布、条件分布及相对风险的计算,并绘制了相应的二维条形图。第二部分利用Python进行了数据处理和可视化,包括计算比值比、识别抽样技术类型、分析鱼类数据集以及探讨辛普森悖论。此外,还提供了针对鱼类和树木数据的统计分析方法。 适合人群:适用于有一定数学和编程基础的学习者,尤其是对统计学、数据分析感兴趣的大学生或研究人员。 使用场景及目标:①帮助学生掌握统计学概念如边际分布、条件分布、相对风险和比值比的实际应用;②教授如何用Python进行数据清洗、分析和可视化;③提高对不同类型抽样技术和潜在偏见的理解。 其他说明:文档不仅包含了理论知识讲解,还有具体的代码实例供读者参考实践。同时提醒读者在完成作业时需要注意提交格式的要求。

Global site tag (gtag.js) - Google Analytics