【性能优化】:从理论中来到实践中去(三)

news2024/9/22 19:29:35

本文主要介绍真实代码实现

序言

根据前面两篇文章的梳理
【性能优化】:探索系统瓶颈的根源(一)
【性能优化】:设计模式与技术方案解析(二)
我们已经知道了自动化跑批系统的核心功能,今天就来真正的代码实现下。

代码实现

步骤状态

public enum CurrentStepStatus {
    ABSENT(0, "步骤不存在"),
    STOP(1, "步骤被终止了"),
    SUCCESS(2, "步骤成功"),
    RUNNING(3, "步骤在运行中"),
    FAILED(4, "步骤失败了"),
    NOSTART(5, "步骤未启动");
}

调度器模板类

/**
 * @description:调度器抽象接口
 */
public abstract class DispatchStepHandler {

    public final boolean handler() {
        if (checkPreviousStepStatus()) {
            String status = checkCurrentStepStatus();

            if (Objects.isNull(status)) {
                return false;
            }

            if (CurrentStepStatus.ABSENT.name().equals(status) || CurrentStepStatus.STOP.name().equals(status)) {
                return false;
            }

            if (CurrentStepStatus.SUCCESS.name().equals(status) || CurrentStepStatus.RUNNING.name().equals(status)) {
                //成功态或运行态,不会执行业务逻辑,跳过去
                return true;
            } else {
                return businessOltp();
            }
        }
        return false;
    }

    /**
     * 检查前一个步骤的状态:只有前一个步骤执行成功后,才能执行当前步骤
     * @return
     */
    protected abstract boolean checkPreviousStepStatus();

    /**
     * 当前步骤业务处理
     * @return
     */
    protected abstract boolean businessOltp();

    /**
     * 在执行当前步骤业务逻辑前,先检查当前步骤的状态,步骤不存在或者是stop状态,则整个调度链停止运行
     * @return
     */
    public abstract String checkCurrentStepStatus();
}

核心抽象方法说明

  • checkPreviousStepStatus 检查前一个步骤的状态,只有前一个步骤执行成功后,才能执行当前步骤;
  • checkCurrentStepStatus 检查当前步骤状态,步骤不存在或者是停止状态,则整个调度链停止运行,步骤是成功或运行状态则跳过;
  • businessOltp 当前步骤的核心业务逻辑。

步骤实现类

每个步骤都是一个业务实现类,去实现抽象的调度器模板接口
在这里插入图片描述
Step1Handler 为例

/**
 * @description:步骤1:业务数据导入实现类
 */
@Service
@Slf4j
public class Step1Handler extends StepCommonService {

    @Autowired
    private DingService dingService;

    /**
     * 检查前一个步骤的状态:只有前一个步骤执行成功后,才能执行当前步骤
     * @return
     */
    @Override
    protected boolean checkPreviousStepStatus() {
        return true;
    }

    /**
     * 在执行当前步骤业务逻辑前,先检查当前步骤的状态,步骤不存在或者是stop状态,则整个调度链停止运行
     * @return
     */
    @Override
    public String checkCurrentStepStatus() {
        return super.checkCurrentStepStatus("step1");
    }

    /**
     * 当前步骤业务处理
     * @return
     */
    @Override
    @DingMonitor(node = "step1", remark = "增量数据导入", input = true, output = true)
    protected boolean businessOltp() {
        try {

             /**
              * 核心业务逻辑
              */

            return true;
        } catch (Exception e) {
            log.error("步骤一【增量数据导入】异常", e);
            dingService.sendDingWarn("步骤一", "增量数据导入异常");
            return false;
        }
    }
}

责任链类

@Component
@Slf4j
public class StepHandlerChain {

    @Autowired
    private List<DispatchStepHandler> stepHandlers;



    @Autowired
    private DispatchService dispatchServiceImpl;


    private List<DispatchStepHandler> handlers = new ArrayList<>();

    @PostConstruct
    void init() {
        for(DispatchStepHandler handler:stepHandlers){
        	handlers.add(handler);
        }
    }

    /**
     * 执行真实业务类方法
     */
    public void execute() {
        boolean allStatus = true;
        for (DispatchStepHandler handler : handlers) {
            boolean result = handler.handler();
            if (!result) {
                allStatus = false;
                break;
            }
        }
        if (allStatus) {
            log.info("所有步骤执行成功,开始更新dispatch表状态");
            /**
            * 更新dispatch表
            */
        } else {
            log.info("存在失败的步骤,dispatch表状态不能更新");
        }
    }
}

入口类

    @EncryptCommon
    @DingMonitor(node = "step0", remark = "业务跑批")
    @GetMapping("/dispatchChain")
    public Object dispatchChain(){
        log.info("开始执行责任链步骤");
        try {
            // 前置逻辑
            stepHandlerChain.execute(); //调度链入口
        } catch (Exception e) {
            log.info("执行责任链步骤异常", e);
            return Res.error("调度异常");
        }
        return Res.success();
    }

总结

通过 3 篇文章,大概介绍了自动化跑批系统实现的历程,由于篇幅有限还有一些细节的点没有介绍,不过这也不是重点。
核心是我们碰到瓶颈点的时候怎么去思考问题,分析问题,然后去付诸行动。

真正的挑战在于,我们发现了问题,却选择了妥协和将就,而不是追求卓越和改进

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

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

相关文章

如何使用混合搜索实现更好的 LLM RAG 检索

通过结合密集嵌入和BM25构建高级本地LLM RAG管道 基本的检索增强生成&#xff08;RAG&#xff09;管道使用编码器模型在给定查询时搜索相似文档。 这也被称为语义搜索&#xff0c;因为编码器将文本转换为高维向量表示&#xff08;称为嵌入&#xff09;&#xff0c;在该表示中&…

【计算机组成原理】汇总五、中央处理器

五、中央处理器 文章目录 五、中央处理器1.CPU的功能与结构1.1CPU功能1.2运算器1.2.1基本结构1.2.2 ALU和寄存器的数据通路 1.3控制器1.3.1基本结构1.3.2控制器功能 1.4CPU的基本结构 2.指令执行过程2.1指令周期2.2指令周期流程2.3数据流2.4指令执行方案&#xff1a;如何安排多…

Type-C接口诱骗取电快充方案

Type-C XSP08Q 快充协议芯片是一种新型电源管理芯片&#xff0c;主要负责控制充电电流和电压等相关参数&#xff0c;从而实现快速充电功能。Type-C XSP08Q快充协议是在Type-C接口基础上&#xff0c;加入了XSP08Q协议芯片的支持&#xff0c;很大程度上提升了充电速度。 正常情况…

ConcurrentHashMap扩容原理 | 存储流程 | 源码探究

新人写手&#xff0c;代码菜鸡&#xff1b;笔下生涩&#xff0c;诚惶诚恐。 初试锋芒&#xff0c;尚显青涩&#xff1b;望君指点&#xff0c;愿受教诲。 本篇文章将从源码的层面&#xff0c;探讨ConcurrentHashMap的存储流程以及扩容原理 Java版本为JDK17&#xff0c;源代码可…

Ollama 本地部署

文章目录 前言一、Ollama是什么&#xff1f;二、使用步骤1.安装 OllamaWindows检验是否安装成功 2.运行ollama 模型库运行模型提问修改配置&#xff08;可选&#xff09;如果有个性化需求&#xff0c;需要修改默认配置&#xff1a; 参考 前言 Ollama是一个易于使用的本地大模型…

LivePortraitV3,支持图像驱动和区域控制,更精确的人像控制(WIN,MAC)

LivePortrait又又又又更新了&#xff01;这速度真是&#x1f44d;&#x1f3fb;&#x1f44d;&#x1f3fb; 【LivePortraitV3&#xff0c;支持图像驱动和区域控制&#xff0c;更精确的人像控制&#xff08;WIN&#xff0c;MAC&#xff09;】 https://www.bilibili.com/video/…

别暑气 迎秋意

今年长达40天的“三伏”结束啦&#xff01; 伏天过后&#xff0c;暑热逐渐消退&#xff0c;天气开始转凉&#xff0c;秋季逐渐来临。我们也该调整好生活节奏&#xff0c;去迎接收获季节的开始。 1、注意防寒保暖 天气逐渐转凉&#xff0c;昼夜温差不断增大&#xff0c;所以要…

Pytest自动化测试框架关联/参数化实战

关联 利用Python提供的fixture可以实现关联 实现步骤&#xff1a; 在case目录下&#xff0c;新建conftest.py文件&#xff0c;比如我们需要token&#xff0c;就在这个文件下定义一个公共的方法&#xff0c;调用登录接口并返回需要的token值&#xff08;注&#xff1a;公共的方…

【乐企】有关乐企能力测试接口对接-货物运输服务(详细)

1、前置条件&#xff0c;参考【乐企】有关乐企能力测试接口对接-基础版&#xff08;详细&#xff09; 2、接口文档 和基础版区别&#xff1a; 1、传参的时候添加了 用例编码&#xff1a;ylbm 2、发票上传接口的服务编码变化了&#xff1a;fwbm:HWYSFPSC 3、能力编码和用例编码…

Linux——安装软件(mysql)

一、应用部署&#xff1a; 安装软件 运行某个程序或者服务 安装软件包 dnf/yum 包安装工具官方网站提供的集成软件包源码编译安装 // 源码编译的步骤 只应用于编译型语言 对于解释性语言编写的程序 采用不用的方式打包 编译型语言编写的程序&#xff1a; nginx解释性语言…

Verilog刷题笔记63

找BUG 1、&#xff1a;Bug mux2 挑错&#xff1a; module top_module (input sel,input [7:0] a,input [7:0] b,output [7:0]out );assign out sel?a:b;endmodule结果正确&#xff1a; 原因: 1、输出out也应为8位 2、逻辑错误&#xff0c;&按位操作&#xff0c;需要将…

【可兼容的】protobuf、streamlit、transformers、icetk、cpm_kernels版本号

搞大模型训练的工作不可避免地需要很多库&#xff0c;但是非常讨厌的事情是这些库动不动就不兼容。最近在做文本分类训练的时候又遇到了这个问题&#xff0c;为了避免后面再安装包的时候把我之前的环境破坏了&#xff0c;所以特地来记录一下&#xff1a;protobuf、streamlit、t…

GD32F4xx---RTC初始化设置及闹钟方式实现秒中断讲解

GD32F4xx—RTC初始化设置及闹钟方式实现秒中断讲解 1、下载链接:源码工程 一、概述 GD32F4x的RTC例程网上资源较少,详细阅读用户手册后做出如下配置。RTC模块提供了一个包含日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码显示外,时间和日期都以BC…

欧科云链: Web3浪潮下合规是“必选项”, 技术创新成发展重点

如果说2023年将是Web3的监管与合规之年。那么2024年就是Web3发展里程碑之年。 自2023年&#xff0c;包括美国、日本、新加坡、迪拜、中国香港等全球多个国家和地区金融中心都先后宣布要成为Web3中心、虚拟资产中心&#xff0c;并努力在监管框架下推动Web3生态的技术创新。 放…

对新手的现货白银交易建议

近期现货白银价格表现十分不错&#xff0c;连续的上涨已经突破了30关口&#xff0c;这是一个重要的心理关口&#xff0c;受投资行情的吸引&#xff0c;很多新手现货白银交易者入场。那么&#xff0c;有没有一些对这些新手投资者的现货白银交易建议呢&#xff1f;下面我们就来讨…

通过Docker部署Nacos,以及Docker Desktop进行管理

目录 一.不需要持久化存储 1.启动容器 2.查看容器和镜像​ 3.容器管理 二.持久化存储启动mysql容器 1.创建docker卷 2.运行容器,指定卷 3.在nacos里面随便建个配置文件 4.停止并删除nacos容器 5.重新运行容器,并且挂载相同的卷,也就是上面第二步的命令 6.打开nacos并…

redis的紧凑列表ziplist、quicklist、listpack

文章目录 前言一、ziplist1.1 ziplist 查找复杂度高1.2 ziplist 连续更新风险 二、quicklist三、listpack 前言 当数据量较小时&#xff0c;Redis 会优先考虑用 ziplist 来存储 hash、list、zset&#xff0c;这么做可以有效的节省内存空间&#xff0c;因为 ziplist 是一块连续…

2024年用哪个思维导图软件好?这款在线工具堪称国产之光!

思维导图软件哪个好&#xff1f; 如今已经是2024年了&#xff0c;想做思维导图&#xff0c;面对琳琅满目的思维导图软件&#xff0c;哪一个才是最适合我们的呢&#xff1f; 在选用思维导图软件时&#xff0c;我们可能会综合考虑多个方面&#xff0c;譬如功能数量、操作易用性…

未来工作场所:知识中台与AI的融合

在快速迭代的未来工作场所&#xff0c;知识中台与AI的融合正引领着一场深刻的工作方式变革。这种融合不仅优化了企业的知识管理流程&#xff0c;还通过智能工具如AI问答、内容生成等&#xff0c;极大地提升了工作效率和决策质量。接下来&#xff0c;我们将以HelpLook AI知识库为…

【C/C++】C++类与对象基本概念(抽象与封装、构造函数、析构函数、静态、友元)

文章目录 七、类与对象基本概念抽象定义与声明访问控制类的实现与使用对象指针、this指针与对象引用构造函数析构函数拷贝构造函数 七、类与对象基本概念 抽象 抽象是相对&#xff0c;而非绝对的 在研究问题时&#xff0c;侧重点不同&#xff0c;可能会产生不同的抽象结果;解决…