时间同步失败_跨系统历史数据同步脚本实战
????????平時開發過程中可能會碰到令人頭疼的歷史數據同步問題,尤其是跨系統數據同步更加讓人頭疼。通常碰到這樣的問題大家站穩、不要慌,可能只需寫一個簡單的同步腳本就可以解決。
實戰場景
前段時間小北寫過一個文章介紹怎樣用隊列解決內部應用打通的問題,如果有疑問可以先查看此文章:簡單隊列and分發隊列。當時我們只是通過隊列來實現系統間的賬戶實時同步注冊。要想保證需求上線后所有的賬號都能跨應用使用還要考慮歷史注冊的賬戶如何同步。下面我們通過寫一個腳本來實現!
<?php namespace console\controllers\mysync;class MySyncAccountsClass{ /** * 同步A應用用戶賬號到B應用 * 命令行輸入:php yii /my-sync-accounts/sync-a-account-to-b * @return string */ public function actionSyncAAccountToB(){ echo PHP_EOL . '【開始執行】' . PHP_EOL; $users = Users::find()->where(['has_synced' => 0]); $userCount = Users::find()->where(['has_synced' => 0]); echo $users->createCommand()->getRawSql(); $this->callCreateBAccount($users->orderBy('CreatedOn desc'), $userCount->count()); return true; } /** * 批量請求B應用同步接口 * @param $token * @param $entitys * @param $entitysCount * @return array */ private function callCreateBAccount($users, $userCount){ echo "一共需要同步" . $userCount . "個賬號" . PHP_EOL; $begin = microtime(TRUE); //記錄同步失敗的user_id $allErrUserIds = []; $allErrCount = $total = 0; $batchSize = 20; foreach ($users->batch($batchSize) as $batchUser){ $result = [];//此處調用B應用接口批量創建賬號省略接口調用代碼????????????$errCount?=?count($result['errUserIds']);????????????foreach?($result['successUserIds']?as?$successUserId)?{????????????????User::update(['has_synced'?=>?1])->where(['user_id'?=>?$successUserId]);????????????} if ($result['res'] === false) { $this->logger->error('同步賬號失敗',[ 'errUserIds' => $result['errUserIds'], ]); $allErrCount += $result['errCount']; $allErrUserIds = array_merge($allErrUserIds, $result['errUserIds']); } $total += $batchSize; } $end = microtime(TRUE); $time = $end - $begin; echo PHP_EOL . "【統計】一共執行時間" . $time . "s" . PHP_EOL; echo "【統計】一共需要同步" . $userCount . "個賬號" . PHP_EOL; echo "【統計】一共執行同步" . $total . "個賬號" . PHP_EOL; echo "【統計】其中同步" . ($total - $allErrCount) . "個賬號成功" . PHP_EOL; echo "【統計】其中同步" . $allErrCount . "個賬號失敗" . PHP_EOL; }}????????如上代碼:代碼中包含部分的偽代碼,主要為了描述代碼實現的大致流程,代碼復制粘貼不保證能運行哦!
注意事項????????
????????通過上面的實現過程我想提醒大家在寫跨應用數據同步腳本過程中需要注意的幾點:
????????? ??1. 日志要記錄清楚,包括執行過程中的流程日志(在控制臺執行時打印流程日志可以幫助執行者實時掌握腳本運行情況)、? 錯誤異常日志(記錄到日志文件中,包括錯誤的用戶標識和用戶同步失敗的原因,幫助開發者事后查找同步失敗的原因);
????????? ? ? ?2. 用戶表添加同步結果字段如has_synced,用于重復執行腳本的時候可以過濾掉同步成功的用戶賬號(在業務代碼中也要根據隊列同步賬號的結果來更新此字段);
?????????????? 3. 第三方同步接口要支持批量同步(減少sql查詢次數和接口通訊次數,在大數據量的時候可以大大降低資源消耗,提高同步效率);
????????????? ?4. 異步鎖(可以防止并發處理導致數據混亂),此處我并沒有用到鎖機制,因此我只能認為保證不會發生并發執行腳本。
????????以上就是我處理不同系統間歷史數據同步問題的方法,如果有沒考慮到或者不正確的地方歡迎留言。如果有更好的方法也可以互相交流哦!
總結
以上是生活随笔為你收集整理的时间同步失败_跨系统历史数据同步脚本实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python for everybody
- 下一篇: 由于采用分时技术 用户可以独占计算机资源