[從原始碼學設計]螞蟻金服SOFARegistry 之 ChangeNotifier
阿新 • • 發佈:2021-01-12
# [從原始碼學設計]螞蟻金服SOFARegistry 之 ChangeNotifier
[toc]
## 0x00 摘要
SOFARegistry 是螞蟻金服開源的一個生產級、高時效、高可用的服務註冊中心。
本系列文章重點在於分析設計和架構,即利用多篇文章,從多個角度反推總結 DataServer 或者 SOFARegistry 的實現機制和架構思路,讓大家藉以學習阿里如何設計。
本文為第十五篇,分析如何執行ChangeNotifier 來通知相關模組:hi,這裡有新資料變化來到了,兄弟們走起來。
## 0x01 業務範疇
### 1.1 概述
當有資料釋出者 publisher 上下線時,會分別觸發 publishDataProcessor 或 unPublishDataHandler,Handler 會往 dataChangeEventCenter 中新增一個數據變更事件,用於非同步地通知事件變更中心資料的變更。事件變更中心收到該事件之後,會往佇列中加入事件。
1. 此時 dataChangeEventCenter 會根據不同的事件型別非同步地對上下線資料進行相應的處理,即把這個事件變更資訊變成ChangeNotifier ,進而變成Operator,放到AbstractAcceptorStore;
2. 與此同時 DataChangeHandler 會把這個事件變更資訊通過 ChangeNotifier 對外發布,通知其他節點進行資料同步。
因為篇幅限制,前文對 ChangeNotifier 這部分只是略過,本文就詳細講解下事件變更通知ChangeNotifier。 這裡會再把整理流程串起來,會涉及到前面某些文章內容。
先給出圖示以便大家瞭解 ChangeNotifier 的作用。
```java
+--------------------+
| PublishDataHandler |
+--------+-----------+
|
|
| publisher
|
v
+---------+------------+
|DataChangeEventCenter |
+---------+------------+
|
|
| ChangeData
v
+---------+------------+
| DataChangeEventQueue |
+---------+------------+
|
|
| ChangeData
v
+-------+----------+
| DataChangeHandler|
+-------+----------+
|
|
| ChangeData
v
+------+--------+ +------------+
| ChangeNotifier| +--------> | datumCache |
+------+--------+ +------------+
|
|
v
+---+------+
| notifier |
+---+------+
|
v
+-----------+---------------+
| |
v v
+----+----------------+ +------+----------+
|SessionServerNotifier| | BackUpNotifier |
+----+----------------+ +------+----------+
| |
| |
| |
| v
+--v------------+ +------+----------------+
| sessionServer | | AbstractAcceptorStore |
+---------------+ +-----------------------+
```
### 1.2 資料變化
資料變化有兩個方向
- 資料伺服器節點變化;
- 資料的變化,即Publisher和Scriber的變化;
ChangeNotifier就是負責把 Publisher和Scriber的變化 通知給相關模組。變更通知就是一種解耦 。
## 0x02 資料結構
我們首先需要看看通知的資料結構。
### 2.1 介面定義
IDataChangeNotifier是通知的介面定義:
```java
public interface IDataChangeNotifier {