日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

时间同步失败_跨系统历史数据同步脚本实战

發布時間:2025/3/20 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 时间同步失败_跨系统历史数据同步脚本实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????平時開發過程中可能會碰到令人頭疼的歷史數據同步問題,尤其是跨系統數據同步更加讓人頭疼。通常碰到這樣的問題大家站穩、不要慌,可能只需寫一個簡單的同步腳本就可以解決。

實戰場景

前段時間小北寫過一個文章介紹怎樣用隊列解決內部應用打通的問題,如果有疑問可以先查看此文章:簡單隊列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. 異步鎖(可以防止并發處理導致數據混亂),此處我并沒有用到鎖機制,因此我只能認為保證不會發生并發執行腳本。

????????以上就是我處理不同系統間歷史數據同步問題的方法,如果有沒考慮到或者不正確的地方歡迎留言。如果有更好的方法也可以互相交流哦!

總結

以上是生活随笔為你收集整理的时间同步失败_跨系统历史数据同步脚本实战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。