【性能优化】:设计模式与技术方案解析(二)

news2024/9/20 8:03:26

引言

在 【性能优化】:探索系统瓶颈的根源(一)文章中,我们已经分析了手动结算的弊端和瓶颈,本文来分析下怎么优化系统性能。

需求分析

既然手动结算耗时费力易出错,那么能不能开发一个**程序自动化处理**呢?如果要开发一个自动化跑批的程序,核心功能点是什么呢?

第一:需要能正常运行;
第二:出错了之后也得能重跑;
第三:既然是自动化处理了,步骤结果信息能通知到我们;
第四:系统能够自动生成财务报表并下载;
第五:能看到每次步骤的执行详情;
第六:需要数据库表记录每次执行步骤的参数,供下次使用。

通过上述分析,我们已经能够得出,一个自动化跑批的程序,核心功能点如下

  1. 正常运行
  2. 出错重试
  3. 节点报警
  4. 步骤详情
  5. 一个可视化的界面

所以,我们的自动化跑批模型大概类似于这种
自动化跑批模型图

表结构设计

通过需求分析,我们已经大概知道了自动化跑批的功能点,现在来设计下表结构。

CREATE TABLE ` dispatch ` (
  ` id ` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '数据库表主键',
  ` dispatch_time ` timestamp NOT NULL COMMENT '调度日期',
  ` status ` varchar(10) NOT NULL COMMENT '调度状态(failed、success、running、pause、human)',
  ` remarks ` varchar(50) DEFAULT NULL COMMENT '备注',
  ` create_time ` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  ` update_time ` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (` id `)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '调度表'

CREATE TABLE ` dispatch_detail ` (
  ` id ` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '数据库表主键',
  ` dispatch_id ` bigint(20) NOT NULL COMMENT '调度表主键',
  ` step ` varchar(20) NOT NULL COMMENT '步骤',
  ` start_time ` timestamp NULL DEFAULT NULL COMMENT '开始日期',
  ` end_time ` timestamp NULL DEFAULT NULL COMMENT '结束日期',
  ` status ` varchar(10) NOT NULL COMMENT '调度状态(failed、success、running、pause、human)',
  ` remarks ` varchar(50) DEFAULT NULL COMMENT '备注',
  ` create_time ` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  ` update_time ` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  ` execution_time ` varchar(50) DEFAULT NULL COMMENT 'DAG调度时间',
  ` serial_number ` int(10) DEFAULT NULL COMMENT '步骤序号',
  ` result ` varchar(1000) DEFAULT NULL COMMENT '返回结果',
  ` params ` varchar(1000) DEFAULT NULL COMMENT '请求参数',
  PRIMARY KEY (` id `),
  KEY ` idx_step ` (` step `),
  KEY ` idx_dispatch_id ` (` dispatch_id `)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '调度明细表'

CREATE TABLE ` back_record ` (
  ` id ` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '数据库表主键',
  ` back_pt ` varchar(20) NOT NULL COMMENT '备份日期',
  ` create_time ` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  ` update_time ` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  ` dispatch_id ` bigint(20) NOT NULL COMMENT '调度表主键',
  PRIMARY KEY (` id `)
  /*T![clustered_index] CLUSTERED */
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '备份记录表'

CREATE TABLE ` netting_record ` (
  ` id ` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '数据库表主键',
  ` back_pt ` varchar(20) NOT NULL COMMENT '备份日期',
  ` version ` varchar(20) NOT NULL COMMENT '备份版本号',
  ` create_time ` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  ` update_time ` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  ` dispatch_id ` bigint(20) NOT NULL COMMENT '调度表主键',
  PRIMARY KEY (` id `)
  /*T![clustered_index] CLUSTERED */
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '轧差记录表'

CREATE TABLE ` sap_record ` (
  ` id ` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '数据库表主键',
  ` product_version ` varchar(20) NOT NULL COMMENT '发送sap日期',
  ` create_time ` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  ` update_time ` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  ` dispatch_id ` bigint(20) NOT NULL COMMENT '调度表主键',
  PRIMARY KEY (` id `)
  /*T![clustered_index] CLUSTERED */
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = 'sap发送记录表'

代码设计

通过需求分析和表结构设计,我们已经大致有一个模型了,为了让程序扩展性更好,所以还需要对代码结构设计下。

步骤配置化

步骤列表信息不能写死,如果之后有变动,还需要改动代码发布,所以我们可以把它放到公司的配置中心动态配置,在调度运行的时候加载到表中,并以接口形式返回给前端。

钉钉通知

如果要监控每一步骤的执行信息,如输入参数、返回参数、执行状态、运行时长等信息,我们可以引入钉钉通知。
具体可参考 高效实时监控:异步计算任务的挑战与解决方案(一)

设计模式

为了使代码的扩展性更好、可读性更强,我们可以引入设计模式来设计。通过跑批模型图,可以得到以下信息

  • 各个步骤的执行特别符合一条“责任链”,从起始节点依次向下执行,直到尾节点;
  • 各个步骤在执行时,都必需满足上一个节点执行成功且自己没有执行过,如果把这个流程代码放到一个抽象的父类,各个步骤子类去实现自己的业务逻辑,这就是“模板方法”。

可参考:
【职责链】设计模式:构建灵活的请求处理系统
【模板方法】设计模式:构建可扩展软件的基石

总结

通过以上简单分析,我们已经可以大概能想象出自动化跑批系统的雏型了,在下一篇我们就要实际编码来实现了。
以上分析肯定存在漏洞不完善的地方,欢迎大家批评指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2080954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM32开发——(十八)RTC实时时表

1. RTC内置实时时钟 1.1 RTC时钟介绍 RTC是实时时钟(Real-Time Clock)的缩写。它是一种硬件模块或芯片,用于提供准确的日期和时间信息。 GD32F407上有RTC的外设,它提供了一个包含日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码显示外,时间和日期都以BCD码…

JSP中的动态INCLUDE与静态INCLUDE:简明对比

JSP中的动态INCLUDE与静态INCLUDE:简明对比 1、静态INCLUDE2、动态INCLUDE3、总结 💖The Begin💖点点关注,收藏不迷路💖 在JSP开发中,页面包含分为动态INCLUDE和静态INCLUDE两种,它们各有特点。…

详细分析Oracle中的ALL_TAB_COLUMNS视图语句

目录 1. 基本知识2. Demo 1. 基本知识 ALL_TAB_COLUMNS 是 Oracle 数据库的一个数据字典视图,用于提供关于数据库中所有可见表的列信息 对于数据库管理、开发和调试非常有用 基本的字段描述如下: 字段名描述OWNER列出表所在的所有者(sche…

神经网络——CIFAR10小实战

1.引子 Sequential的使用:将网络结构放入其中即可,可以简化代码。 找了一个对CIFAR10进行分类的模型。 2.代码实战 from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linearclass Tudui(nn.Module):def __init__(self):super(T…

SOMEIP_ETS_069: Unaligned_SOMEIP_Messages_overUDP

测试目的: 验证设备(DUT)能够处理在单个UDP包中发送的三个SOME/IP消息,并且即使其中一个SOME/IP消息未对齐,DUT仍能对所有三个请求给出正确的响应。 描述 本测试用例旨在检查DUT在通过UDP协议接收到包含一个未对齐S…

【Pytorch】Linear 层,举例:相机参数和Instance Feaure通过Linear层生成Group Weights

背景 看论文看到这个pipeline,对于相机参数和Instance Fature 的融合有点兴趣,研究如下: Linear 层 Linear 层是最基本的神经网络层之一,也称为全连接层。它将输入与每个输出神经元完全连接。每个连接都有一个权重和一个偏置。…

inflight 守恒算法负反馈解析

终于说到这个话题了。 bbr 不好吗,我自己也做过很多关于 bbr 的仿真验证,现网数据分析以及数学建模,结论均指向 bbr 是一个公平高效且天然不会引发 bufferbloat 的算法,但细节值得商榷: 非理想哑铃拓扑下测量误差的叠…

Dubbo3框架概述

1 什么是分布式系统? 《分布式系统原理与范型》定义: “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统” 分布式系统(distributed system)是建立在网络之上的软件系统。 简单来说:多个(不同职责)人共同来完成一件事! 任何一台服务器都无法…

Dockerfile+私有仓库

使用Dockerfile创建应用镜像 在Docker file中定义所需要执⾏的指令,使⽤ docker build创建镜 像,过程中会按照dockerfile所定义的内容进⾏打开临时性容器,把docker file中命令全部执⾏完成,就得到了⼀个容器应⽤镜像,每…

PHP-开发工具下载-配置-使用

.1.下载 使用各种人工智能工具推荐的php免费开发工具。 文心一言推荐的工具 讯飞星火的回答 kimi的回答 根据自己的了解,最终选择vscode这款开发工具。 .2.配置 文心一言的回答 讯飞星火的回答 kimi的回答 最终选择使用PHP Debug 插件来支持。 安装中文插件。 …

NASA数据集:MetOp-A ASCAT 第 2 级海洋表面风矢量,针对沿岸海洋进行了优化

MetOp-A ASCAT Level 2 Ocean Surface Wind Vectors Optimized for Coastal Ocean 简介 该数据集包含 MetOp-A 上的高级散射计(ASCAT)以 12.5 公里采样分辨率(注:有效分辨率为 25 公里)进行的近实时 2 级沿岸海面风矢…

实战OpenCV之图像的数学运算

基础入门 在OpenCV中,图像的数学运算是一种基本而强大的工具,可以用于多种图像处理任务,包括:图像增强、图像融合、特征提取等。这些运算包括加法、减法、乘法和除法等基本的数学操作。 加法运算:可以用来合并两个图像…

【JS】卢小姐排队问题(100) |思路参考+代码解析(C++)

题目 LYA 的班级要进行一次班级活动,全班同学按照学号从小到大排成一列。但是卢小姐来晚了,没有来得及排队。现在卢小姐想知道,她应该插入到队列的哪个位置,才能保证队列仍然是按照学号从小到大排列的。请你帮助卢小姐找到她应该…

微服务框架之Kitex

Kitex: 高性能的 Golang 微服务框架 Kitex 是由字节跳动(ByteDance)开发并开源的一款高性能微服务框架,专为构建分布式系统和微服务架构设计。Kitex 基于 Golang,旨在提供一个简单、高效、灵活的开发体验,帮助开发者快…

ST表(区间查询

解决的问题&#xff1a; 数组区间查询最大值和最小值对于解决数组的树状数组的区间修改 ------- 线段树倍增思想 核心代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1e5; int num[N]; int f[N][N]; int main(){int n;cin>>n;//输入默…

无线通信频率分配

首先看看无线电信号的频谱如何划分&#xff1a; 一、5G NR 3GPP已指定5G NR 支持的频段列表&#xff0c;5G NR频谱范围可达100GHz&#xff0c;指定了两大频率范围&#xff1a; ① Frequency range 1 &#xff08;FR1&#xff09;&#xff1a;就是我们通常讲的6GHz以下频段 频率…

Lesson07---STL简介(了解)

1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的重要性 5. 如何学习STL 6.STL的缺陷 1. 什么是STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与…

【网络】P2P打洞原理

本文首发于 ❄️慕雪的寒舍 1. 引入 如果你折腾过NAS或者BT下载等等玩意&#xff0c;可能听说过“P2P打洞”这一技术名词。简单来说&#xff0c;P2P打洞可以让我们直接在外网访问内网的设备&#xff0c;从而让没有公网IP的家庭设备也能获得“公网直连”的速度。 比如绿联、极…

【JAVA]DAY 2在网页中输出日期和时间,实时还是静止?

一、如何输出日期文本 使用document.write(Date()); 会在网页中输出当前的日期和时间。在 2024 年 8 月 28 日星期三执行这段代码&#xff0c;可能会输出类似 “Wed Aug 28 2024 [具体时间]” 这样的内容。 Date()是 JavaScript 中的一个内置对象&#xff0c;用于处理日期和…

【机器学习】数据预处理-特征工程与特征选择

目录 一、特征工程 二、数据变换 1.变换 2.归一化 三、数据清洗 1.异常数据 2.数据清洗 四、特征选择 1.Filter过滤法 2.Wrapper包裹法 ... 3.Embedded嵌入法 ... 五、降维算法 1.SVD 2.PCA 一、特征工程 特征工程就是从原始数据提取特征的过程&#xff0c;这些…