当前位置: 首页 > news >正文

[自研开源] 数据集成之分批传输 v0.7

开源地址:gitee | github
详细介绍:MyData 基于 Web API 的数据集成平台
部署文档:用 Docker 部署 MyData
使用手册:MyData 使用手册
试用体验:https://demo.mydata.work
交流Q群:430089673

介绍

本篇基于 数据集成之任务流程 介绍任务分批传输的使用场景和配置操作。

使用场景

mydata使用API方式集成数据,当一次请求或响应 传输数据量较多时 可能无法完成、或容易对服务端造成影响,因此需要分为多次处理;

例如 常见的分页查询、导入大量数据时分批处理、集成对接时的全量同步等;

分批传输数据

业务系统与mydata集成时,在提供数据消费数据这两个方向上分别实现分批传输;

提供数据

由mydata调用应用的API获取数据,通过配置分批参数 实现一次任务内多次调用API获取完整数据,有以下两种基本的配置模式:

  • 配置了 固定参数size=10、递增参数current从1开始每次递增1、每次间隔1秒的任务;

在这里插入图片描述

  • 配置了 递增参数start从1开始每次递增100、递增参数end从100开始每次递增100、每次间隔1秒的任务;

在这里插入图片描述

执行过程如下代码,要点有:

  • 通过do-while结构 兼容单次和分批;

  • lastProduceData记录上一次数据,用于和本次对比数据,若重复 则结束,避免死循环(理论上很少有2次完全一样的数据);

  • 若分批有异常,则复用任务3次出错 自动结束并发送邮件通知的功能;

  • 执行完一次后,自动计算递增参数值;

// 提供数据
case MdConstant.DATA_PRODUCER:// 分批模式 记录上一次数据,用于对比两次数据,若重复 则结束,避免死循环List<Map> lastProduceData = null;do {// 若启用分批,则将分批参数加入请求参数中if (taskInfo.isBatch()) {Map<String, Object> batchParam = jobBatchService.parseToMap(taskInfo);Map<String, Object> reqParams = MapUtil.union(taskInfo.getReqParams(), batchParam);taskInfo.setReqParams(reqParams);}// 调用api 获取jsonString json = ApiUtil.read(taskInfo);// 将json按字段映射 解析为业务数据jobDataService.parseData(taskInfo, json);// 若没有返回数据,则结束处理if (CollUtil.isEmpty(taskInfo.getProduceDataList())) {break;}// 对比上一次数据if (lastProduceData != null) {if (CollUtil.isEqualList(lastProduceData, taskInfo.getProduceDataList())) {// 异常任务失败,邮件通知用户检查任务throw new RuntimeException("分批获取数据异常,最后两次获取的数据相同!");}}lastProduceData = taskInfo.getProduceDataList();// 根据条件过滤数据jobDataFilterService.doFilter(taskInfo);// 保存业务数据jobDataService.saveTaskData(taskInfo);// 更新环境变量jobVarService.saveVarValue(taskInfo, json);// 递增分批参数jobBatchService.incBatchParam(taskInfo);// 若启用分批,则等待间隔if (taskInfo.isBatch()) {ThreadUtil.sleep(taskInfo.getBatchInterval(), TimeUnit.SECONDS);}} while (taskInfo.isBatch());break;

消费数据

由mydata通过API向应用发送数据,通过配置分批参数 限制每次向API发送的数据量,从而减少数据查询量和请求处理时间;

如下图,配置了分批数量为1000的任务,分批参数为选填,mydata将按1000为限制查询符合条件的数据,通过API请求发送给应用;

在这里插入图片描述

执行过程如下代码,要点有:

  • 通过do-while结构 兼容单次和分批;
  • 自动管理分页参数,执行分页查询数据,发送给API;
  • 直到分页查询没有数据 自动结束;
// 消费数据
case MdConstant.DATA_CONSUMER:String dataCode = taskInfo.getDataCode();if (StrUtil.isEmpty(dataCode)) {break;}List<BizDataFilter> filters = taskInfo.getDataFilters();if (CollUtil.isNotEmpty(filters)) {// 解析过滤条件值中的 自定义字符串parseFilterValue(filters);// 排除值为null的条件filters = filters.stream().filter(filter -> filter.getValue() != null).collect(Collectors.toList());}int round = 0;Long skip = null;Integer limit = taskInfo.isBatch() ? taskInfo.getBatchSize() : null;do {if (taskInfo.isBatch()) {skip = (long) round * taskInfo.getBatchSize();}// 根据过滤条件 查询数据List<Map> dataList = bizDataDAO.list(MdUtil.getBizDbCode(taskInfo.getTenantId(), taskInfo.getProjectId(), taskInfo.getEnvId()), dataCode, filters, skip, limit);if (CollUtil.isEmpty(dataList)) {break;}taskInfo.setConsumeDataList(dataList);// 根据字段映射转换为api参数jobDataService.convertData(taskInfo);// 调用api传输数据ApiUtil.write(taskInfo);round++;// 若启用分批,则等待间隔if (taskInfo.isBatch()) {ThreadUtil.sleep(taskInfo.getBatchInterval(), TimeUnit.SECONDS);}}while (taskInfo.isBatch());break;

相关文章:

  • Java复习第十二天学习笔记(JDBC),附有道云笔记链接
  • 数据运营分析-详解
  • 架构师之路--Docker的技术学习路径
  • 线性回归的从零开始实现
  • 项目管理—项目合同签订后客户又不认了
  • MFC(一)搭建空项目
  • 面试题:Spring事务管理策略与@Transactional注解详解
  • 自定义你的商店 – 设计WooCommerce商店的新方法
  • 京东云服务器价格_云主机价格查询系统_2024年京东云优惠活动
  • Linux---命令行参数
  • 7、jenkins项目构建细节-常用的构建触发器
  • C++基础之虚函数(十七)
  • uniapp 未配置appkey或配置错误的解决
  • vue 文件预览(docx、.xlsx、pdf)
  • 飞天使-k8s知识点28-kubernetes散装知识点5-helm安装ingress
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • IP路由与转发
  • Javascript弹出层-初探
  • jquery cookie
  • Meteor的表单提交:Form
  • oschina
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 阿里研究院入选中国企业智库系统影响力榜
  • 初识 webpack
  • 如何设计一个微型分布式架构?
  • 收藏好这篇,别再只说“数据劫持”了
  • 微信开源mars源码分析1—上层samples分析
  • 我这样减少了26.5M Java内存!
  • 小而合理的前端理论:rscss和rsjs
  • 一道闭包题引发的思考
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 运行时添加log4j2的appender
  • zabbix3.2监控linux磁盘IO
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​iOS安全加固方法及实现
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • !!java web学习笔记(一到五)
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (4)(4.6) Triducer
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (pytorch进阶之路)扩散概率模型
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (层次遍历)104. 二叉树的最大深度
  • (二)hibernate配置管理
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (三)elasticsearch 源码之启动流程分析
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)EOS中账户、钱包和密钥的关系
  • (转)fock函数详解
  • (转)Sql Server 保留几位小数的两种做法
  • ***测试-HTTP方法
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...