# my_swrr **Repository Path**: ckwang17/my_swrr ## Basic Information - **Project Name**: my_swrr - **Description**: 本项目实现了一个高性能、高并发场景下优化的平滑加权轮询算法(Smooth Weighted Round-Robin),专门针对大规模节点(2000+)和高并发场景进行了优化,确保在多线程环境下准确按照权重比例分配流量。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-11-30 - **Last Updated**: 2025-12-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, 性能优化, 平滑加权轮询算法, SWRR ## README # 高并发优化的平滑加权轮询算法 (Optimized SWRR) 本项目实现了一个高性能、高并发场景下优化的平滑加权轮询算法(Smooth Weighted Round-Robin),专门针对大规模节点(2000+)和高并发场景进行了优化,确保在多线程环境下准确按照权重比例分配流量。 ## 1. 核心优化策略 ### 1.1 算法层面优化 - **标准平滑加权轮询**:严格实现标准算法步骤,确保权重分配准确性 - **高效权重更新**:优化权重计算和更新流程,提高选择效率 - **惰性计算**:按需计算总权重,避免重复求和 ### 1.2 数据结构优化 - **高效索引**:使用ConcurrentHashMap实现O(1)的节点查找 - **分片存储**:支持将节点分成多个分片,适应不同并发场景 ### 1.3 并发控制优化 - **同步块保护**:使用同步块确保选择过程的原子性 - **原子操作**:节点权重更新使用CAS操作(AtomicLong)确保线程安全 - **线程安全设计**:所有公共方法均线程安全,支持高并发环境 ### 1.4 工程实现优化 - **权重缓存**:预计算总权重,避免重复求和 - **内存布局**:连续内存存储,优化CPU缓存利用率 - **自适应分片**:根据CPU核心数自动调整分片数量 ## 2. 项目结构 ``` src/main/java/com/swrr/optimized/ ├── ServerNode.java # 服务器节点类(含原子权重更新) ├── OptimizedSWRR.java # 优化的平滑加权轮询算法实现 ├── SWRRUtils.java # 工具类(节点创建、统计等) └── SWRRDemo.java # 演示程序 src/test/java/com/swrr/optimized/ ├── SWRRUnitTest.java # 单元测试 └── SWRRBenchmarkTest.java # JMH性能基准测试 ``` ## 3. 使用方法 ### 3.1 基本使用 ```java // 创建优化的SWRR实例(8个分片) OptimizedSWRR swrr = new OptimizedSWRR(8); // 添加服务器节点 swrr.addServer(new ServerNode("server-1", "192.168.1.1:8080", 5)); swrr.addServer(new ServerNode("server-2", "192.168.1.2:8080", 3)); swrr.addServer(new ServerNode("server-3", "192.168.1.3:8080", 2)); // 选择节点(高并发安全) ServerNode selectedNode = swrr.select(); System.out.println("选中节点: " + selectedNode.getAddress()); // 更新节点状态 swrr.updateServerStatus("server-1", false); // 标记为不健康 // 移除节点 swrr.removeServer("server-2"); ``` ### 3.2 创建默认配置 ```java // 使用默认配置(根据CPU核心数自动调整分片) OptimizedSWRR swrr = OptimizedSWRR.createDefault(); ``` ### 3.3 运行演示程序 ```bash # 编译项目 mvn clean compile # 运行演示 mvn exec:java -Dexec.mainClass="com.swrr.optimized.SWRRDemo" ``` ## 4. 性能特性 ### 4.1 性能指标 - **支持节点规模**:2000+节点稳定运行 - **实测QPS**:在10线程并发、2000节点场景下,QPS约15,000+ - **并发能力**:支持多线程高并发访问 - **权重分配准确度**:准确按照节点权重比例分配流量 ### 4.2 扩展性 - 支持动态添加/移除节点 - 支持节点健康状态动态调整 - 分片数量可配置,适应不同并发场景 ## 5. 运行测试 ### 5.1 运行单元测试 ```bash mvn test ``` ### 5.2 运行性能基准测试 ```bash # 编译并运行基准测试 mvn clean package java -jar target/benchmarks.jar ``` ### 5.3 性能测试参数 可以修改`SWRRBenchmarkTest.java`中的参数来测试不同场景: - 不同节点数量:100, 500, 1000, 2000 - 不同分片数量:1, 4, 8, 16, 32 - 不同并发线程数:通过`@Threads`注解配置 ## 6. 算法实现特点 - **高准确性**:严格实现标准平滑加权轮询算法,确保按照权重比例准确分配流量 - **线程安全**:使用同步块和原子操作确保多线程环境下的正确性 - **性能优化**:在保证准确性的前提下,优化算法执行效率 - **简单可靠**:实现简洁明了,易于维护和理解 ## 7. 适用场景 - 高并发负载均衡器 - API网关流量分发 - 分布式系统节点选择 - 需要精确权重分配的资源调度 - 大规模集群(2000+节点)的请求分发 ## 8. 注意事项 1. **权重配置**:合理设置节点权重,避免极端权重值 2. **分片数量**:分片数量建议为CPU核心数的2-4倍 3. **内存使用**:大规模节点场景下注意内存消耗 4. **线程安全**:所有公共方法均为线程安全,可以直接用于高并发环境 5. **健康检查**:建议配合外部健康检查机制使用,及时更新节点状态 ## 9. 后续优化方向 1. 进一步优化并发性能,提高QPS 2. 实现更细粒度的节点分片策略 3. 添加自适应权重调整机制 4. 支持权重热更新和持久化 5. 添加监控指标收集功能