記錄一次餘額遷移的坑(測試角度)

風清揚不在華山發表於2019-07-31

一、這是一個遷移流程圖;現在把action做個簡單的記錄:備註:本次遷移核心是遷移流水,通過流水的收入-支出-餘額=0,在平臺使用者最少的時候進行遷移(凌晨2點進行);找出收入和支出有差異的--仔細對賬查賬;然後運維配合,流水扎帳,記錄最大的流水id;繼續賬單平賬,然後進行快照流水回放遷移,遷移完成後,進行對賬,收入-支出-餘額=0那就很好,恭喜你沒有采坑,系統健壯;我們就不是,然後就一點一點查賬對賬;賬單平了以後,可以繼續遷移,遷移增量(首先我們是熱牽),遷移增量可能 要進行好幾次,每次遷移都要對賬;

 

No.
ACTION
REMARK
執行任務
1 針對user_balance表執行一次獲取差異賬單(賬單一) 查出賬單,通常是54筆

select u.code, u.nickname , u.available_balance, (
(select sum(ub.balance) from user_balance ub where ub.user_code = u.code and ub.status = 1 and ub.bi_type =1)
-
(select sum(ub.balance) from user_balance ub where ub.user_code = u.code and ub.status = 1 and ub.bi_type =2)
) as '收入減支出'
from user u where available_balance <>
(
(select sum(ub.balance) from user_balance ub where ub.user_code = u.code and ub.status = 1 and ub.bi_type =1)
-
(select sum(ub.balance) from user_balance ub where ub.user_code = u.code and ub.status = 1 and ub.bi_type =2)
);

2 取一次流水錶最大id 取出流水錶中的最大的id(MAX_ID) SELECT MAX(id) from user_balance ;
3 再獲取一次獲取差異賬單(賬單二) 查出賬單,通常是54筆 select u.code, u.nickname , u.available_balance, (
(select sum(ub.balance) from user_balance ub where ub.user_code = u.code and ub.status = 1 and ub.bi_type =1)
-
(select sum(ub.balance) from user_balance ub where ub.user_code = u.code and ub.status = 1 and ub.bi_type =2)
) as '收入減支出'
from user u where available_balance <>
(
(select sum(ub.balance) from user_balance ub where ub.user_code = u.code and ub.status = 1 and ub.bi_type =1)
-
(select sum(ub.balance) from user_balance ub where ub.user_code = u.code and ub.status = 1 and ub.bi_type =2)
);
4 驗證賬單一和賬單二是否一致

賬單一和賬單二進行對比,如果不一致需要重新備份 

5 進行差異賬單平賬 差異賬單進行調整,通過資金後臺功能,匯入excel,自動進行平賬

需要提供匯入平賬的能力;

fund-manager已提供http介面

核對差異賬單正確性

 

SELECT * FROM user_account WHERE 1 limit 100;

SELECT * FROM org_account where 1 limit 100;

6 進行快照流水遷移

從0開始遷移到MAX_ID為止到流水,進行業務回放

需要提供從0到N流水號回放的能力

fund-manager已提供http介面

7 遷移完成後進行資金系統對賬 收入-支出 -餘額 = 0
select u.account_id, u.account_name, u.user_code, (
(select IFNULL(sum(flow.flow_amount),0) from sg_account.account_funds_flow flow where flow.account_id = u.account_id and flow.flow_direct =1)
-
(select IFNULL(sum(flow.flow_amount),0) from sg_account.account_funds_flow flow where flow.account_id = u.account_id and flow.flow_direct =0)
) as '收入減支出'
, total_balance "總餘額"
from sg_account.user_account u where total_balance <>
(
(select IFNULL(sum(flow.flow_amount),0) from sg_account.account_funds_flow flow where flow.account_id = u.account_id and flow.flow_direct =1)
-
(select IFNULL(sum(flow.flow_amount),0) from sg_account.account_funds_flow flow where flow.account_id = u.account_id and flow.flow_direct =0)
);
8 檢驗是否有差異 正常情況下應該是0
9 進行差異資料單筆重試

需要提供單筆業務重試的能力

fund-manager已提供http介面

10 對資金系統進行備份 sg_account庫
11 增量遷移

提供增量遷移能力,記錄老系統ID和新系統ID,在執行業務之前,需要進行冪等(執行轉賬業務之前,fund-manager),

user_balance存在order_no為

需要提供從X到Y流水號回放的能力(和從0到MAX_ID的能力是同一個)

fund-manager已提供http介面

12 應用釋出(含業務迴歸驗證)

應用釋出

13 再次進行增量遷移 提供增量遷移能力(可執行之前一樣的操作)

需要提供從X到Y流水號回放的能力(和從0到MAX_ID的能力是同一個)

fund-manager已提供http介面

14 遷移完成後進行資金系統對賬 收入-支出 -餘額 = 0
select u.account_id, u.account_name, u.user_code, (
(select IFNULL(sum(flow.flow_amount),0) from sg_account.account_funds_flow flow where flow.account_id = u.account_id and flow.flow_direct =1)
-
(select IFNULL(sum(flow.flow_amount),0) from sg_account.account_funds_flow flow where flow.account_id = u.account_id and flow.flow_direct =0)
) as '收入減支出'
, total_balance "總餘額"
from sg_account.user_account u where total_balance <>
(
(select IFNULL(sum(flow.flow_amount),0) from sg_account.account_funds_flow flow where flow.account_id = u.account_id and flow.flow_direct =1)
-
(select IFNULL(sum(flow.flow_amount),0) from sg_account.account_funds_flow flow where flow.account_id = u.account_id and flow.flow_direct =0)
);
15 進行系統間對賬

系統內對賬: 資金系統快照2 - 資金系統快照1 = 增量流水軋差 + 新業務流水

系統間對賬:老系統增量流水和新系統遷移流水進行對賬

增量流水獲取
16 針對差異資料進行單筆調賬

需要提供單筆業務重試的能力

fund-manager已提供http介面

二、開發踩得的坑,測試流的淚

          1.  userbalance表, serialNo/orderNo 重複, 與遷移程式唯一單號生成策略衝突,導致部分資料丟失。

           eg: 介面併發,同一筆訂單可能生成多筆,我就看到一個用相同訂單號有17筆;

          2.  userbalance有記錄,但user表沒有使用者 引發bug、賬不平。

           eg:使用者userCode被修改,或者直接被刪除,但是有消費過,balance裡面沒有被處理

          3.  account-business 對於已存在的commonbill賬單,再次申請會進行資料覆蓋,導致後面重複的單號資料會覆蓋前面轉賬成功的資料,從而account-business與account-core賬對不上。

          4. account-business呼叫轉賬時,金額小於等於0會直接變成成功,不走account-core。 應改為金額等於0直接成功,不走core。金額小於0報錯

        

三、測試需要關注點:

  1. 測試用例質量和checklist是否清晰明瞭:第一次接觸餘額遷移,我知道必須重視,可是我還是重視不夠,寫出的checklist沒有進行評審,就上手了
  2. 遷移風險,遷移方案沒有完全吃透:如果遷移失敗,有回滾方案嗎?遷移的效能瓶頸?有些歷史資料處理--待入賬?接入新資料相容問題等,上線後,全面業務迴歸

 

相關文章