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

news/2024/7/10 20:07:24 标签: 开源, 数据仓库, 数据集成, API对接, 业务融合

开源地址: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 获取json
        String 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;

http://www.niftyadmin.cn/n/5452766.html

相关文章

【环境配置】Ubuntu MySQL 8.0.28 安装并允许外部客户端连接

文章目录 MySQL 安装步骤配置 MySQL Server 允许外部连接 MySQL 安装步骤 步骤一&#xff1a;在 MySQL 官网找到 apt 仓库&#xff0c;下载最新的仓库 点击 Download&#xff1a; 输入如下命令&#xff1a; sudo wget -c https://dev.mysql.com/get/mysql-apt-config_0.8…

数据结构与算法分析引论1

1.解决问题的算法有很多&#xff0c;但是在输入不同的情况下&#xff0c;不同算法之间的差异也很大&#xff0c;我们总是追求一个更快、更有效的方法。比如说普通的依次查找和二分查找&#xff0c;两者的差异就很大。我们使用大O表示法来表示算法的速度。依次查找就是O(n)&…

中间件学习--InfluxDB部署(docker)及springboot代码集成实例

一、需要了解的概念 1、时序数据 时序数据是以时间为维度的一组数据。如温度随着时间变化趋势图&#xff0c;CPU随着时间的使用占比图等等。通常使用曲线图、柱状图等形式去展现时序数据&#xff0c;也就是我们常常听到的“数据可视化”。 2、时序数据库 非关系型数据库&#…

移动端Web笔记day03

移动 Web 第三题 01-移动 Web 基础 谷歌模拟器 模拟移动设备&#xff0c;方便查看页面效果&#xff0c;移动端的效果是当手机屏幕发生了变化&#xff0c;页面和页面中的元素也要跟着等比例变化。 屏幕分辨率 分类&#xff1a; 硬件分辨路 -> 物理分辨率&#xff1a;硬件…

YOLOv7 | 注意力机制 | 添加ECA注意力机制

目录 原理简介 代码实现 yaml文件实现&#xff08;tips&#xff1a;可以添加不同的位置&#xff09; 检查是否添加执行成功 完整代码分享 论文创新必备&#xff08;可帮忙做实验&#xff09; 启动命令 ECA是通道注意力机制的一种实现形式&#xff0c;是基于SE的扩展。…

Spring框架与Spring Boot的区别和联系

引言 Spring框架和Spring Boot都是Java生态中最受欢迎的开源框架&#xff0c;它们各自扮演着不同的角色&#xff0c;帮助开发者构建高效的企业级应用。本教程将从零基础的角度出发&#xff0c;让你轻松理解这两者的区别和联系。 Spring框架简介 Spring框架&#xff0c;简称Spri…

微服务高级篇(五):可靠消息服务

文章目录 一、消息队列MQ存在的问题&#xff1f;二、如何保证 消息可靠性 &#xff1f;2.1 生产者消息确认【对生产者配置】2.2 消息持久化2.3 消费者消息确认【对消费者配置】2.4 消费失败重试机制2.5 消费者失败消息处理策略2.6 总结 三、处理延迟消息&#xff1f;死信交换机…

中国科学院半导体研究所汪林望:在曙光超级计算机上对第一性原理计算软件LS3DF进行1000万个硅原子模拟

编者荐语&#xff1a; 面对纳米材料等大体系时&#xff0c;电荷补丁法可以计算几千甚至上万原子&#xff0c; 但是电荷补丁法作为非自洽计算&#xff0c;不能给出原子受力&#xff0c;也不能用来弛豫原子坐标。面对摩尔条纹或线性位错等问题&#xff0c;我们需要弛豫原子的坐标…