Similarityoung opened a new issue, #905: URL: https://github.com/apache/dubbo-go-pixiu/issues/905
### ✅ 验证清单 - [x] 🔍 我已经搜索过 [现有 Issues](https://github.com/apache/dubbo-go-pixiu/issues),确信这不是重复请求 - [x] 📋 我已经查看了 [发布说明](https://github.com/apache/dubbo-go-pixiu/releases),确信此功能尚未实现 ### 🎯 功能描述 ## 背景 Pixiu 在 listener、router、连接复用和治理层已经有一定并发优化基础,但 cluster 模块当前仍存在热路径开销、runtime 状态边界不清和部分正确性问题。 这个 issue 用来统一记录 cluster 当前问题,以及后续优化方向,作为后续改造的 tracking。 ## 当前问题 - `PickEndpoint()` / `PickNextEndpoint()` 仍通过 `store.Config` 线性查找 cluster,读路径不是 O(1) - `store.Config` 和 `clustersMap` / runtime cluster 存在双视图问题,`UpdateCluster()`、`CompareAndSetStore()` 的 runtime 同步不完整 - `GetEndpoint(true)` 在请求热路径上重复过滤健康节点,并构造临时切片 - `RoundRobin` 直接修改 `ClusterConfig.PrePickEndpointIndex`,共享状态模型不适合高并发读路径 - `RoundRobin` 在全不健康节点场景下会 panic - `Rand` 当前按总节点数取随机上界,但索引的是健康节点切片,部分不健康场景下会 panic - `RingHash` / `Maglev` 依赖已有一致性哈希结构,不能和简单 LB 用同一思路直接改 - 当前测试对动态更新、边界条件和并发行为覆盖不足 ## 优化方向 - 先收口 `store.Config` 与 runtime cluster 的一致性,明确 cluster runtime 的真实数据源和生命周期 - 再将 cluster 查找切到 O(1) - 将健康节点过滤从请求路径移到状态变更路径,引入健康节点快照 - `RoundRobin`、`Rand`、`WeightRandom` 优先改为读取健康快照,并修复边界问题 - `RingHash` / `Maglev` 单独处理,首轮保持现有哈希语义不变 - 先补测试和 benchmark,再推进实现改造 ## 建议顺序 1. 补测试和 benchmark 2. 修复当前明显正确性问题 3. 收口 runtime 一致性 4. 切 O(1) cluster 查找 5. 引入健康节点快照 6. 优化简单 LB 热路径 7. 最后处理一致性哈希 LB ## 验收标准 - `PickEndpoint()` 不再线性扫描 `store.Config` - 请求热路径不再重复构造健康节点切片 - `RoundRobin` / `Rand` 在无健康节点或部分不健康节点时不会 panic - `UpdateCluster()` / `CompareAndSetStore()` 不再遗留 stale runtime state - cluster 相关测试和 benchmark 能覆盖核心场景 ## 涉及文件 - `pkg/server/cluster_manager.go` - `pkg/cluster/cluster.go` - `pkg/model/cluster.go` - `pkg/cluster/healthcheck/healthcheck.go` - `pkg/cluster/loadbalancer/roundrobin/round_robin.go` - `pkg/cluster/loadbalancer/rand/load_balancer_rand.go` - `pkg/cluster/loadbalancer/weightrandom/weight_random.go` - `pkg/cluster/loadbalancer/ringhash/ring_hash.go` - `pkg/cluster/loadbalancer/maglev/maglev_hash.go` ### 📋 使用场景 none ### ⚖️ 复杂性与风险评估 _No response_ ### 🔗 外部依赖 _No response_ ### 📚 附加信息 _No response_ -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
