当前位置: 首页 > news >正文

分布式通信框架 - JGroups

在分布式系统开发中,节点间的通信和协调是一个核心问题。JGroups 作为一个成熟的 Java 集群通信框架,为构建可靠的分布式应用提供了强大的基础设施。

JGroups 是一个用于创建可靠组通信的 Java 工具包。它允许应用程序创建进程组,组内成员可以相互发送消息,并且能够处理节点的加入、离开以及故障恢复等场景。JGroups 被广泛应用于 JBoss、Infinispan、ActiveMQ 等知名开源项目中。

JGroups

核心特性
1、可靠的消息传递:保证消息的有序性和可靠性
2、组成员管理:自动处理节点的加入和离开
3、故障检测:及时发现并处理节点故障
4、灵活的协议栈:支持多种网络协议和传输方式
5、高性能:经过优化的消息传递机制

Protocol Stack(协议栈)
协议栈是 JGroups 的心脏,由多个协议层组成,每个协议层负责特定的功能:

传输层协议:UDP、TCP、TUNNEL
故障检测协议:FD、FD_SOCK、VERIFY_SUSPECT
可靠传输协议:UNICAST3、NAKACK2
组成员协议:PING、MERGE3、GMS
流量控制协议:UFC、MFC
排序协议:SEQUENCER、FRAG3

基础使用示例
1. 创建简单的集群应用

public class Chat {public static void main(String[] args) throws Exception {// 创建通道--指定协议配置文件JChannel channel = new JChannel("jgroups-tcp.xml");// 设置接收器channel.setReceiver(new Receiver() {@Overridepublic void receive(Message msg) {System.out.println(msg.getObject().toString());Receiver.super.receive(msg);}});// 连接到集群channel.connect("ChatCluster");BufferedReader in = new BufferedReader(new InputStreamReader(System.in));while (true) {// 发送消息String line = in.readLine();if ("exit".equals(line)) break;Message msg =new ObjectMessage(null, line);channel.send(msg);}channel.close();}
}

配置文件jgroups-tcp.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--JGroups TCP配置文件
-->
<config xmlns="urn:org:jgroups"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups.xsd"><!-- TCP传输协议 --><TCP bind_port="7800"recv_buf_size="5M"send_buf_size="5M"sock_conn_timeout="300"thread_pool.enabled="true"thread_pool.min_threads="2"thread_pool.max_threads="8"port_range="2"thread_pool.keep_alive_time="5000"/><!-- TCP节点发现协议 --><TCPPING initial_hosts="localhost[7800],localhost[7801]"port_range="1" /><!-- 合并协议 --><MERGE3 max_interval="30000"min_interval="10000"/><!-- 验证协议 --><VERIFY_SUSPECT timeout="1500"/><!-- 可靠的单播协议 --><pbcast.NAKACK2 xmit_interval="500"xmit_table_num_rows="100"xmit_table_msgs_per_row="2000"xmit_table_max_compaction_time="30000"use_mcast_xmit="false"discard_delivered_msgs="true"/><!-- 单播协议 --><UNICAST3 xmit_interval="500"xmit_table_num_rows="100"xmit_table_msgs_per_row="1000"xmit_table_max_compaction_time="60000"/><!-- 组成员协议 --><pbcast.GMS print_local_addr="true" join_timeout="2000"/><!-- 消息分片协议 --><UFC max_credits="2M"min_threshold="0.4"/><!-- 消息分片协议 --><MFC max_credits="2M"min_threshold="0.4"/><!-- 消息压缩协议 --><FRAG2 frag_size="60K"/><!-- 状态传输协议 --><pbcast.STATE_TRANSFER/></config>

注意,并不需要事先显式地创建一个集群,如果是集群第一个实例,Connect()将创建集群。所有连接同一集群的实例将在同一集群中,

2. 编程方式自定义协议栈配置

public class ProgrammaticChat {public static void main(String[] args) throws Exception {Protocol[] prot_stack={new UDP().setValue("bind_addr", InetAddress.getByName("127.0.0.1")),new PING(),new MERGE3(),new FD_SOCK(),new FD_ALL(),new VERIFY_SUSPECT(),new BARRIER(),new NAKACK2(),new UNICAST3(),new STABLE(),new GMS(),new UFC(),new MFC(),new FRAG2()};JChannel ch=new JChannel(prot_stack).name("");ch.setReceiver(new Receiver() {public void viewAccepted(View new_view) {System.out.println("view: " + new_view);}public void receive(Message msg) {System.out.println("<< " + msg.getObject() + " [" + msg.getSrc() + "]");}});ch.connect("ChatCluster");for(;;) {String line= Util.readStringFromStdin(": ");ch.send(null, line); // causes an ObjectMessage to be created}}}

集群信息交互效果
节点一发送消息
image-20250714102639533
image-20250714102639533
节点二接收消息
在这里插入图片描述

总结

JGroups 作为一个成熟的集群通信框架,为构建可靠的分布式应用提供了强大的基础设施。在实际应用中,需要根据具体的业务需求和网络环境选择合适的协议配置,并注意性能优化和故障处理。更多功能参见官方文档http://www.jgroups.org/manual5/index.html#_overview

http://www.dtcms.com/a/280060.html

相关文章:

  • 从零开始的云计算生活——第三十二天,四面楚歌,HAProxy负载均衡
  • 数据怎么分层?从ODS、DW、ADS三大层一一拆解!
  • 智慧园区:激活城市活力的数字化引擎
  • 【colab 使用uv创建一个新的python版本运行】
  • mac上的app如何自动分类
  • 22-C#的委托简单使用-2
  • 自增主键为什么不是连续的?
  • 基于多智能体强化学习的医疗检索增强生成系统研究—MMOA-RAG架构设计与实现
  • Uboot源码超详细分析(2)
  • 力扣25.7.15每日一题——有效单词
  • 对于编写PID过程中的问题
  • TCP可靠性设计的核心机制与底层逻辑
  • TDengine GREATEST 和 LEAST 函数用户手册
  • 26.将 Python 列表拆分为多个小块
  • SSM框架学习DI入门——day2
  • 跨平台移动开发技术深度分析:uni-app、React Native与Flutter的迁移成本、性能、场景与前景
  • IOS 18下openURL 失效问题
  • Flutter瀑布流布局深度实践:打造高性能动态图片墙
  • LVS(Linux Virtual Server)详细笔记(理论篇)
  • JavaScript进阶篇——第三章 箭头函数核心
  • 【问题排查流程总结】tmd2635模块开发中断异常,排查心得
  • python技巧:使用pyvisa控制仪器;安装NI-VISA等visa库;导入pyvisa并创建资源管理器;打开和使用仪器
  • 【 Cache 写策略学习笔记】
  • 编程项目选择思考点以及项目包装的关键点
  • linux系统------LVS+KeepAlived+Nginx高可用方案
  • 优雅的Java:01.数据更新如何更优雅
  • Rocky Linux 9 源码包安装php8
  • 基于按键开源MultiButton框架深入理解代码框架(一)(指针的深入理解与应用)
  • 开源AI Agent开发平台Dify源码剖析系列(二)
  • HTTP 协议