兴业证券基于Apache DolphinScheduler的应用实践

2024-08-31 10:28

本文主要是介绍兴业证券基于Apache DolphinScheduler的应用实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文 / 兴业证券股份有限公司 刘洋  石良生  柳君  李致琪

本文来源于网络,如有侵权,请联系删除

任务调度平台,扮演着自动执行预设任务的重要角色,是业务开展过程中不可或缺的一环。随着业务规模的不断扩展,兴业证券每日需要进行数以万计的任务调度,因此,优化和提升任务调度平台的性能与稳定性至关重要。本文通过分析兴业证券自身任务调度现状,对分布式任务调度技术进行解析与探索,并总结了统一分布式任务调度平台的实践经验。

file

兴业证券金融科技部

总经理助理    刘洋

建设统一分布式任务调度平台的必要性

在兴业证券早期,任务调度平台由项目组各自构建并维护,这在业务规模未产生爆发式增长前,尚能够满足日常的业务需求。但随着近年来业务量的迅猛增长,这种分散式管理的弊端开始逐渐显现,导致开发成本日益增加、运维复杂度与日俱增。与此同时,由于各调度平台自身功能不完善而导致的问题也日益突出。任务依赖管理及任务并发控制能力上的欠缺,给业务的正常开展带来了一定的隐患。基于以上问题,现有的任务调度平台迫切需要进行统一和整合,以提升系统的稳定性和高效性。通过构建一个统一分布式任务调度平台,技术人员可以实现任务集中管理、统一监控和高效运维,从而降低运维成本,提高开发效率,确保数据的准确性和一致性(见图1)。

file

图1  分散式部署VS集中式部署

平台的建设目标

经过对现有任务调度平台的优缺点进行调研分析后,统一分布式任务调度平台被期冀于实现以下目标和能力。

**1.基础功能要求。**一是高可用性与稳定性:在部分节点故障时能无缝调度任务,确保业务流程不受干扰。二是告警机制成熟性:支持多种告警方式,并允许通过插件进行扩展。三是租户隔离机制:任务对不同租户进行权限隔离,确保数据安全和操作的精确性。四是丰富的任务类型:支持多种任务类型,并允许通过插件进行扩展。五是跨环境配置兼容性:支持测试环境和生产环境间一键配置迁移,避免手动修改配置。六是支持多维度任务调度:同时支持函数调度和进程调度,进程调度支持对任务的交付、部署及管理。

**2.扩展与功能增强。**一是资源线性扩展:通过水平扩展计算资源保持服务的高稳定性。二是动态任务调度:根据资源利用率、任务优先级等因素,动态调整调度策略。三是日志管理与分析:提供日志收集、存储和查询功能,便于快速定位和解决潜在问题。四是安全性与权限控制:确保数据的安全性和完整性,实施严格的权限控制。

**3.用户体验与集成性。**一是直观的任务编排工具:提供易用的可视化编排界面,减少依赖关系引起的错误。二是可扩展的API接口:允许第三方系统无缝集成,扩展平台功能和应用场景。

**4.性能与监控。**一是性能监控与调优:实时监控关键性能指标,并根据监控结果进行针对性的优化。二是任务执行即时监控:提供直观的任务执行状态展示,帮助运维人员快速响应、处理异常。

**5.故障处理与并发控制。**一是故障转移机制:在节点故障时,确保任务能够无缝转移到其他可用节点。二是并发控制策略:根据任务类型限制最大并发数,避免因并发数过高导致的性能问题。

平台的技术方案

鉴于任务调度平台的复杂性和高昂的建设成本,兴业证券决定基于现有的成熟开源分布式任务调度平台进行深度定制开发,以满足特定的技术需求。经过对市场上成熟的开源产品进行详细调研和对比分析,DolphinScheduler被挑选成为了统一分布式任务调度平台的技术原型。兴业证券通过在其基础上进行定制化二次开发,对其部分功能进行了功能增强以及逻辑优化,实现对公司特定业务场景的最佳匹配。

平台能力建设。(1)系统架构(见图2)。统一分布式任务调度平台架构设计的核心目标是保证平台在分布式环境下的高可用及数据一致性。平台主要由三个核心组件构成:API-Server,用于接收各类API请求;Master-Server,负责任务的智能分发以及集群节点的心跳监控;Worker-Server,专注于执行分配的任务。这三个组件均具备水平扩展能力,从而确保了系统始终维持高可用状态。

file

图2  系统架构设计

在功能上,为了支持Java方法任务调度,Worker-Server下游设置了Batch-Server层级用于远程执行Java任务。通过集成Batch-ServerSDK,项目组应用便能成为Batch-Server,轻松获取调度执行Java方法任务的能力。同时,该层级同样支持故障转移,确保任务执行的连续性与稳定性,避免因单点故障而影响整个系统的运行。项目组可以在Batch-Server上引入持久化模块,以数据库、缓存、文件等多种方式对任务执行结果进行持久化,实现无感前提下的幂等性,严格保证Java任务不会因为网络波动或其他外部因素而被重复执行,进而极大地增强了任务执行的稳定性和可靠性。

(2)故障转移实现。统一分布式任务调度平台在保障平台整体服务连续性的同时,也专注于保障具体任务的执行稳定性。

当负责执行任务的Worker-Server节点宕机时,Master-Server能够通过Worker-Server注册在ZooKeeper上的心跳节点及时感知到具体Worker-Server的下线行为,随即将该Worker-Server上正在执行的任务重新分发至其他存活的Worker-Server,实现任务故障转移,保障任务的正常执行。Java任务与其他任务类型相比,显得更为特殊。由于其执行节点并非Worker-Server,而是Batch-Server,因此常规任务类型的故障转移逻辑对其并不适用。

当负责执行Java任务的Batch-Server节点宕机时,负责分发此次任务的Worker-Server可通过ZooKeeper上的心跳节点感知到此次调度的Batch-Server下线,随即挑选集群内另一台可用的Batch-Server发起任务调度。Batch-Server在任务执行过程中使用了分布式锁机制,即使是由于网络波动而引起的Batch-Server的“虚假下线”也不会造成多台Batch-Server上重复执行同一任务,从而确保了任务执行的高效、稳定(见图3)。

file

图3  Batch-Server“虚假下线”时的故障转移实现

当负责此次Java任务分发的Worker-Server节点宕机时,Master-Server会先按照常规故障转移逻辑,挑选另一台存活的Worker再次进行Java任务分发。在此过程中,新的Worker-Server会将任务回调地址由宕机的Worker-Server地址更改为本机地址,从而确保Batch-Server在任务完成后的回调请求能够被准确无误地发送至新的Worker-Server,而不是已经下线的Worker-Server,造成任务执行状况异常。新的Worker-Server在分发环节会随机挑选一台可用的Batch-Server进行调度,但是由于先前的Batch-Server仍持有分布式锁,因此本次调度并不具有实际效果,不会引起任务的重复执行(见图4)。

file

图4  Worker-Server宕机时的故障转移实现

凭借精心设计的故障转移逻辑,统一分布式任务调度平台实现了对任务执行可靠性的保证,确保任务在各种极端情况下依然能够被正确处理。

(3)监控能力集成。在日常开发和运维过程当中,开发人员和运维人员更关注的是那些执行出现异常的工作流和任务。他们需要快速定位指定时间范围内的异常工作流和任务,对问题展开排查。

为了满足这一需求,平台配备了工作流监控与任务监控功能。这些功能能够提供给定时间范围和特定条件下工作流和任务的执行状态统计信息,帮助运维人员迅速定位出现问题的工作流或任务。此外,监控页面还支持仅关注某一收藏组下的工作流和任务,这样用户就可以屏蔽非重要信息,专注于关键任务。用户只需在工作流定义和任务定义菜单下将特定工作流或任务添加到所选收藏组,随后在监控页面选择监控该收藏组即可,从而极大地方便了用户过滤和关注指定工作流和任务。

(4)事件驱动整合(见图5)。任务调度平台的核心在于实现任务的精准调度,即根据预设的逻辑条件驱动相应任务的逻辑执行。驱动逻辑执行的方式主要分为三种:请求驱动、时间驱动和事件驱动。这三种方式在触发机制和语义表达上具有各自的特点。

file

图5  事件驱动架构应用

事件驱动是通过事件发布者发布特定事件,从而去触发事件订阅者执行相应的处理逻辑。在事件驱动架构中,事件发布者无需关心订阅者的数量和处理方式。事件订阅者通过从事件总线中拉取事件来触发相应的逻辑。

常见的分布式任务调度平台均支持以API请求驱动和定时任务时间驱动两种方式触发任务逻辑,但在事件驱动方面则稍显不足。为弥补这一短板,平台在API-Server、Master-Server和Alert-Server中集成了兴业证券事件驱动SDK,可赋予它们强大的事件发布和订阅功能。

经过集成优化,API-Server能够精准处理事件总线中任务调度相关的主题事件,灵活触发对应的任务调度逻辑;Master-Server在完成工作流和任务执行后,能够迅速将执行结果上报至性能分析平台,实现高效的数据流转;而Alert-Server则能在告警事件触发时迅速发布任务调度告警事件,为多个下游系统提供及时的告警处理支持。事件驱动架构的引入,不仅显著降低了任务调度平台与其他系统之间的耦合度,还极大地提升了系统间交互的灵活性和响应速度。

思考与展望

经过不断的建设和大力推广,统一分布式任务调度平台已顺利跨越两大重要里程碑:“系统开发完成”与“生产投入使用”。任务调度平台的核心功能已完成开发并成功部署至生产环境,为公司的日常运营提供了坚实的技术支撑。目前,首批项目组已成功将他们的调度任务迁移至该平台,每日执行的任务量已达万条,充分证明了平台的稳定性和高效性。预计到2024年年底,调度平台的月执行任务数将会实现百万级的飞跃。这一规模的迅速壮大,将为公司带来更加统一、高效式的任务调度管理,大幅减少重复建设的成本支出,同时缩短交付周期,为公司的持续发展筑牢根基。

通过对开源分布式任务调度平台进行定制化开发,兴业证券成功打造了一个集调度与监控功能于一身、为开发与运维团队量身定制的企业级分布式任务调度解决方案。未来,平台将致力于对以下关键领域的能力进行持续迭代与扩展,以适应日益复杂多变的业务场景,并为公司业务的蓬勃发展提供坚实支撑。一是深度融合DevOps流程:计划引入DevOps流水线插件,以简化用户操作,使其能够将构建完成的制品一键上传至调度平台,并快速转化为特定类型的调度任务。这能够帮助实现进程任务调度的便捷化,进一步缩短软件交付周期,并显著提升开发效率,助力公司更快速地响应市场变化,提升竞争力。二是支持扩展多种任务类型:不断丰富平台所支持的任务类型,为项目组提供更加多样化的调度选项,以满足不同业务场景下的灵活需求。由于每个项目组都有其独特的业务逻辑和调度要求,为此平台将会提供更加丰富、更加精细化的调度选项,确保项目组能够根据自己的实际需求,选择最合适的任务类型进行调度。

(此文刊发于《金融电子化》2024年7月上半月刊)

本文由 白鲸开源科技 提供发布支持!

这篇关于兴业证券基于Apache DolphinScheduler的应用实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123639

相关文章

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F