apache / apache/servicecomb-java-chassis

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

オープン
#3,723 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Java
スター
1.9k
フォーク
814
平均マージ
8日 23時間
マージ済み PR(30日)
1

説明

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

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

まず、定期的な更新と watch によってトリガーされるタスクの両方について、ServiceComb 1.3.8 のインスタンス検索および local-cache 更新フローを追跡します。複数のインスタンスが offline になる間に、同時更新を再現します。完了の条件は、古い検索結果が新しいインスタンス状態を上書きできず、すでに offline とマークされたノードに requests が送信されないことです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java
領域
distributed-systems
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。