兴业证券基于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

相关文章

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为