apache / apache/servicecomb-java-chassis

微服务实例查询更新存在并发问题,导致先查询的实例状态后更新的问题

未关闭
#3,723 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Java
星标
1.9k
派生
814
平均合并
8 天 23 小时
30 天内合并 PR
1

描述

分析ServiceComb 的源码(1.3.8),发现实例查找存在并发问题,导致出现先查询的实例状态后更新的问题。
触发实例查找和更新主要有两个触发源
1)周期查询更新
2)watch触发
不同的来源会在Service Center Task线程池提交查询更新任务,且可能在不同线程中并发执行,主要步骤为:
```bash
触发源(周期/watch) ---> 注册中心查询实例信息 ---> 实例状态更新到本地缓存
```
从代码看,只有更新本地实例状态时才会有锁同步操作,查询实例则可能并发执行。由于线程调度切换问题,因此即使是先查询到的实例状态结果,也有可能被后更新,导致以上结果。
此问题在注册中心实例watch模式下,多个实例同时下线时容易复现,请求会发到已下线的节点而失败。

贡献指南

这个仓库没有索引到贡献指南

调研方向

首先跟踪 ServiceComb 1.3.8 在定期刷新和由 watch 触发的任务这两种情况下的实例查找与 local-cache 更新流程。在多个实例离线的同时复现并发更新;完成标准是较旧的查找结果不能覆盖较新的实例状态,并且不会向已标记为 offline 的节点发送 requests。

由索引模型根据 Issue 内容生成。

评估

技术栈
java
领域
distributed-systems
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
需要澄清
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。