系統設計 - 兩個平臺數據的同步系統設計和實現

背景: 實現設備信息在兩個平臺以前的同步。咱們的平臺須要保存設備的信息,同時咱們還須要將設備信息同步到第三方平臺。第三方平臺提供RESTful接口。redis

整個系統的設計以下:數據庫

設備操做(添加,刪除,修改)分析網絡

  1. 設備操做分紅兩部分:設備信息更新到本地數據庫和同步到電信Iot平臺
  2. 「設備信息更新到本地數據庫」實現比較簡單,只要更新本地數據庫對應記錄便可
  3. 「同步到電信Iot平臺」相對複雜一些,它在設備信息導入到數據庫成功後,當即觸發同步操做。因爲同步操做可能出現失敗(或網絡異常,第三服務或自身系統bug等),因此還須要定時任務(xxl-job)定時對失敗的任務進行同步
  4. 因爲可能有多個時機觸發同步操做,爲了不對同一個設備同時被多個線程執行屢次同步操做而出現數據不一致的問題,因此須要在同步模塊中增長同步機制,經過redis的分佈式鎖保證同一時刻,同一個設備同時只能被一個線程操做

設備狀態機設計多線程

這裏咱們引入狀態機保證設備操做的事物性。設備狀態圖如上圖,詳細描述以下:

  1. 新增設備 a. 當新增設備時,添加設備到電信Iot平臺,若是執行成功,則狀態設置爲 「已徹底同步」。若是執行失敗,則狀態設置爲 「同步失敗」; b. 對「同步失敗」的設備執行從新添加,若是成功則設置 「已徹底同步」,不然狀態不變分佈式

  2. 當設備徹底同步後,而後設備的信息被修改,再將修改的信息同步到第三方平臺 a. 修改設備後,設備的狀態修改成 「部分同步」 b. 調用設備修改接口同步信息到第三方平臺,若是成功,則狀態設置爲 「已徹底同步」,若是失敗,則狀態不變優化

這裏:第三方的設備同步接口必須保證冪等線程

設備增長操做 設備增長同步的詳細步驟設計

詳細描述以下:

  1. 判斷當前分佈式鎖是否可用,若是鎖不可用,則當即結束,不然下一步(此步保證當有不少線程時同時觸發同步操做時,保證只有一個或少許線程進入後面的步驟)
  2. 獲取分佈式鎖,若是獲取失敗,則等待。若是獲取鎖成功,則下一步
  3. 獲取全部狀態爲 「未同步」 的設備,調用第三方添加接口執行添加操做,當執行完畢後,會執行以下判斷 a. 調用第三方可能會第三方平臺限流的緣由失敗,此時若是咱們還繼續調用接口進行添加是沒有意義,則當前線程從新獲取鎖延長持有鎖的時間,並等待Ns直到限流的期限結束,再進行後續操做 b. 判斷當前已經持有鎖的時間,若是持有鎖的時長超過必定的閾值(此時當前線程還在鎖的持有時間內),則從新獲取鎖延長持有鎖的時間
  4. 獲取全部狀態爲 「同步失敗」 的設備,而後執行和 「未同步」的設備相同的步驟
  5. 最後在finally代碼塊中釋放鎖

觸發「設備增長同步」的時機:3d

  1. 當新增設備成功
  2. 當批量導入任務當即執行
  3. 定時任務定時觸發

設備刪除cdn

詳細步驟以下:

  1. 獲取分佈式鎖,這裏的步驟和「設備同步增長」相似,這裏略
  2. 標記能夠刪除設備
  3. 調用第三方接口進行刪除 a. 若是設備的狀態爲 「未完成」或 「同步失敗」(此時設備未同步到第三方平臺),則跳過本步驟,只要從本地數據刪除便可 b. 若是設備的狀態爲 「未完成」或 「同步失敗」(此時設備未同步到第三方平臺),則須要同時從第三方平臺刪除記錄和本地數據刪除。若是從第三方刪除成功或第三方提示設備不存在,則再從本地刪除記錄。若是第三方提示刪除失敗,則當即結束
  4. 從本地刪除記錄

刪除操做有可能在第2,3步失敗,因此須要定時任務,掃描已經標記刪除的設備,從新執行2,3步。同時這裏須要保證第2,3步的冪等操做。因爲業務的須要,可能須要在第2,3步前先獲取分佈式鎖。

觸發「設備刪除同步」的時機:

  1. 當刪除設備時成功
  2. 定時任務定時觸發

設備修改 設備修改使用相似設備添加方法來實現

  1. 當設備被修改觸發設備同步流程
  2. 更新設備的信息,並設置狀態爲 「未徹底同步」
  3. 將設備信息同步到第三方平臺,若是成功,則設置狀態爲「已徹底同步」,若是失敗,則狀態不變

定時任務獲取設備狀態爲 「未徹底同步」,並執行上面的第2,3步步驟執行同步操做

這裏保證同一個設備只能被一個線程操做,即便咱們使用分佈式服務同一設備同時也只能一個服務一個線程操做

此方案後續能夠優化之處

  1. 優化分佈式鎖的粒度,從而提升效率
  2. 獲取分佈式鎖後,經過多線程進行同步從而操做提升同步效率
  3. 第三平臺也有可能執行設備的修改和刪除操做,此時此平臺也須要通知咱們的系統並執行同步操做。咱們平臺能夠考慮使用MQ解耦。
相關文章
相關標籤/搜索