平时开发过程中可能会碰到令人头疼的历史数据同步问题,尤其是跨系统数据同步更加让人头疼。通常碰到这样的问题大家站稳、不要慌,可能只需写一个简单的同步脚本就可以解决。

实战场景

前段时间小北写过一个文章介绍怎样用队列解决内部应用打通的问题,如果有疑问可以先查看此文章:简单队列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. 异步锁(可以防止并发处理导致数据混乱),此处我并没有用到锁机制,因此我只能认为保证不会发生并发执行脚本。

以上就是我处理不同系统间历史数据同步问题的方法,如果有没考虑到或者不正确的地方欢迎留言。如果有更好的方法也可以互相交流哦!

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

  1. 跨系统实时同步数据解决方案

    数据量太大,单存储节点存不下,就只能把数据分片存储. 数据分片后,对数据的查询就没那么自由.如订单表按用户ID作为Sharding Key,就只能按用户维度查询.我是商家,我想查我店铺的订单,做不到. ...

  2. Java美团下单接单区域处理_订餐系统之同步美团商家订单

    引子 早上和往常一样去工商大学打球,除了今天三分比较准外,一切都还是那样的循规蹈矩. 也许股子里还有那么一些不甘平庸,总想着能改变一下如此无趣的按部就班. 转过行政楼,一波一波的学生在谈笑风生.哦,是 ...

  3. 时间同步失败_关于同步、异常处理的思考

    不同场景下,用户的核心诉求是不一样的.因此,在产品方案的设计中,当我们充分理解用户的核心诉求,同.异步的处理方式,也就有了选择. 案例引入: 公司的运营同事每个月都需要给大批量的指定用户发送优惠券,数 ...

  4. 解决Windows时间同步失败问题!系统时间同步设置!

    使用NTP协议可以让你的计算机自动与服务器上的时间同步.从而保持最准确的时间. 中国国家授时中心的IP地址是:210.72.145.44 (至少我一直没ping通) 在Windows XP/2000/ ...

  5. deepin更新失败_深度系统更新(deepin 20 1003)

    距离deepin 20正式版发布一个月后,社区版本迎来了第一次更新(1003).本次从DDE到应用全面进行了升级,对桌面环境.应用进行功能优化和问题修复,同时本次也推送磁盘管理器.相机应用,邮件和手机 ...

  6. mysql 同步失败_线上MYSQL同步报错故障处理方法总结

    前言 在发生故障切换后,经常遇到的问题就是同步报错,下面是最近收集的报错信息. 记录删除失败 在master上删除一条记录,而slave上找不到 Last_SQL_Error: Could not e ...

  7. win10文件同步到服务器失败,win10系统同步时间同步失败的解决方法

    电脑对日常生活的重要性小编就不多说了,可是一旦遇到win10系统同步时间同步失败的情况,想必大家都遇到过win10系统同步时间同步失败的情况吧,那么应该怎么处理win10系统同步时间同步失败呢?我们依 ...

  8. win10文件同步到服务器失败,手把手为你解决win10系统同步时间同步失败的思路...

    我们在使用win10系统的过程中,经常需要对win10系统同步时间同步失败的情况,想必大家都遇到过win10系统同步时间同步失败的情况吧,那么应该怎么处理win10系统同步时间同步失败呢?我们依照在W ...

  9. 电脑重装系统Win11时间同步失败怎么办

    Win11时间同步失败怎么办?导致出现这一情况的原因有很多,如果你现在的电脑正有这一问题,那么你来对地方了,今天小编将为大家带来最为详细且齐全的Win11时间同步失败的解决方法,下面教给大家操作方法, ...

最新文章

  1. 深度学习中的欠拟合和过拟合简介
  2. 候选翻译文章列表[示范]
  3. php5.4 traits
  4. 用Prime31实现Google Play In-App-Blling
  5. java Web监听器导图详解
  6. java 异步得到函数返回值_使用JavaScript进行异步编程
  7. spanner 的前世今生
  8. 构建安全应用程序架构必须考虑的十二问
  9. 【LeetCode】10. Regular Expression Matching
  10. 让你的程序陪你的好友打会牌吧(零)
  11. 什么是开环控制,闭环控制?它们的根本区别是什么
  12. 福大软工1816 · 团队现场编程实战(抽奖系统
  13. 前端头像上传功能实现之普通图片/头像上传 详细解析1【扩展知识FormData对象】
  14. 转载-大数据管理神器:Ambari自定义stack和服务二次开发详细教程
  15. 软考高级系统架构设计师系列论文三十五:论企业应用集成
  16. 【Android,CustomWidget】Chip:那些搜索记录和好评中的Chips组件
  17. 【影像学基本知识】MR----T1,T2
  18. ICCV 2019 | 中国研究者无缘最佳论文奖项,接收论文数量超美国,商汤57篇论文入选...
  19. onekeyghost 备份系统
  20. ocr文字识别如何识别文字?

热门文章

  1. “面试不败计划”: java语言基础面试题(三)
  2. oracle安装及使用常见错误
  3. 一天搞定HTML----标签语义化04
  4. 「八大排序算法」16张图带你搞懂基数排序
  5. 杭电1016Java实现
  6. Java学习笔记——封装
  7. 派生类的继承方式【C++继承】
  8. Oracle 一些常用的数据字典
  9. 【转】Ubuntu Vi编辑器中文乱码问题的解决
  10. linux 信号灯超时时间到,急!!信号灯超时时间已到错误又出来了!!!!