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

news2024/9/20 18:48:30

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

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

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

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月上半月刊)

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

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

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

相关文章

物联网之硬件元器件基础知识介绍、集成电路、电阻器、电容器、电感器、二极管、三极管、晶体管、连接器、传感器、开关、电源

MENU 前言电子元件采购网址三极管持续更新中 前言 序言 硬件元器件是电子设备和系统的基本构成部分,它们在电子产品的设计、制造和功能实现中起着至关重要的作用。 电阻器(Resistor) 功能:电阻器用于限制电流流过电路的流动,并分配电压。它们…

【复旦微FM33 MCU 外设开发指南】外设篇3——SPI

前言 本系列基于复旦微FM33系列单片机的DataSheet编写,旨在提供一些开发指南。 本文章及本系列其他文章将持续更新,本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期:2024/08/31 文章目录 前言GPIO配置SPI配…

钓鱼特辑(四)安全较量,摆脱“麻瓜”标签

时至今日,尽管员工们对网络安全有所了解,却往往因缺乏足够的安全意识而对攻防没有直观感知。在红队看来,普通员工可能犹如“麻瓜”,防御薄弱,易于突破。 现在红队以求职者或合作方等“人畜无害”的身份在日常沟通中发动…

2024年【广东省安全员C证第四批(专职安全生产管理人员)】新版试题及广东省安全员C证第四批(专职安全生产管理人员)考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 广东省安全员C证第四批(专职安全生产管理人员)新版试题是安全生产模拟考试一点通生成的,广东省安全员C证第四批(专职安全生产管理人员)证模拟考试题库是根据…

adb大全指令(持续更新)

连接adb adb connect 192.168.1.133(局域网ip)连接调试命令 adb shell打开日志工具 logcat

Shopify接口开发工具shopify-sdk踩坑

背景:   先介绍一下shopify-sdk,它使用java语言开发,是用来做shopify接口二次开发的。做过Shopify独立站的都知道,shopify店铺有管理后台去给管理员增删改查商品和订单等数据,这些数据其实都是可以通过shopify提供的…

uniapp__微信小程序如何对比时间组件框选中框之后的时间大小

1、时间组件框选择时间 2、做判断 if (new Date(selectedDate) < new Date(this.startDate)) {uni.showToast({title: 结束时间不能早于起始时间,icon: none,duration: 2000});return;}console.log(new Date(selectedDate),new Date(this.endDate)); 3、打印出来的时间对比…

C#设计模式

前言 大家熟知的GOF23种设计模式&#xff0c;源自《Design Patterns: Elements of Reusable Object-Oriented Software》一书&#xff0c;由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著&#xff0c;四人组Gang of Four简称GOF&#xff01;总结了在面 向…

【例002】利用MATLAB绘制有趣的空间曲线

题目&#xff1a;利用MATLAB绘制以下函数的空间曲线 空间曲线1&#xff1a; { x cos ⁡ ( 3 t ) y sin ⁡ ( 3 t ) for − m 1000 ≤ t ≤ m 1000 z t \begin{cases} x \cos(3t) \\ y \sin(3t) & \text{for } -\frac{m}{1000} \leq t \leq \frac{m}{1000} \\ z t …

心理健康问答系统-AIGC大模型-小程序制作

制作一个心理健康问答系统的小程序&#xff0c;涉及到多个环节和技术领域。这里将从需求分析、技术选型、开发流程、API调用等方面进行详细说明。 一、需求分析与规划 在开始任何项目之前&#xff0c;首先需要明确的是你的小程序想要解决什么样的问题&#xff0c;提供哪些功…

Spring——控制反转(IOC)与依赖注入(DI)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

【C++题解】1722 - 输出两位的巧数

问题&#xff1a;1722 - 输出两位的巧数 类型&#xff1a;简单循环 题目描述&#xff1a; 巧数指的是这样一种特殊的数&#xff0c;该数的各个位数字之和加上各个位数字之积等于本身的自然数。 比如整数 19 &#xff0c;就是一个巧数&#xff0c;因为(19)(19)10919。 请编程输…

DataWhale AI夏令营 2024大运河杯-数据开发应用创新赛-task3

DataWhale AI夏令营 2024大运河杯-数据开发应用创新赛 数据增强数据收集打标签 多的不说少的不唠&#xff0c;之前说过初赛基本就是比谁的数据好了&#xff0c;因为原始数据的质量太低了想跑到0.25都很难所以需要使用一些数据增强策略以及收集一些新的数据集。 数据增强 计算…

LVGL 控件之按钮(lv_button)

目录 一、按钮1、概述2、样式2.1 设置背景2.1.1 颜色2.1.2 透明度2.1.3 渐变色2.1.4 渐变色起始位置设置 2.2 修改边界2.2.1 宽度2.2.2 颜色2.2.3 透明度2.2.4 指定边 2.3 修改边框2.4 修改阴影2.4.1 宽度2.4.2 透明度2.4.3 偏移坐标2.4.4 颜色2.4.5 延伸 2.5 设置圆角弧度2.6 …

C++STL~~list

文章目录 一、list的概念二、list的使用三、list的练习四、与vector的对比五、总结 一、list的概念 list 是一种容器&#xff0c;实现了双向链表结构 它具有以下特点&#xff1a; 动态大小&#xff0c;可按需增减元素数量。高效的插入和删除操作&#xff0c;在任意位置插入和…

(四)进入MySQL 【事务】

一、MySQL事务的概念 MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比如说&#xff0c;在人员管理系统中&#xff0c; 要删除一个人员&#xff0c;即需要删除人员的基本资料&#xff0c;又需要删除和该人员相关的信息&#xff0c;如信箱&#xff0c; 文章等等。…

unity中的InstanceID详解 即Object.GetInstanceID

GetInstanceID 是 Unity 中 Object 类的一个方法,它用于获取一个对象的唯一实例标识符。每个 Unity 对象(如游戏对象、组件、资源等)都有一个唯一的实例 ID,这个 ID 在对象的生命周期内是唯一的。 对于它的生命周期是不确定的。网上说在切换场景或者编辑器关闭重启后会变。…

红黑树刨析(删除部分)

文章目录 红黑树删除节点情景分析情景1&#xff1a;删除节点左右子树都为空情景1.1&#xff1a;删除节点为红色情景1.2&#xff1a;删除节点为黑色情况1.2.1&#xff1a;删除节点的兄弟节点是红色情景1.2.2&#xff1a;删除节点的兄弟节点是黑色情景1.2.2.1&#xff1a;删除节点…

计算机毕业设计选题推荐-大学生竞赛管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

初识Arduino

什么是Arduino Arduino是一款便捷灵活、方便上手的开源电子原型平台。它包含硬件部分&#xff08;即各种型号的Arduino板&#xff09;、软件部分&#xff08;即Arduino IDE&#xff09;&#xff0c;以及其Arduino社区平台。 Arduino由一个欧洲开发团队于2005年冬季开发&#…