一文吃透 SeaTunnel 线程共享机制与任务执行模型设计优化
Apache SeaTunnel Zeta 引擎是社区独立设计的大数据集成和同步专用引擎,本文聚焦于 Zeta 引擎中 TaskExecutionService 和任务调度模型的优化设计,涵盖 TaskGroup 的通信方式、call() 驱动模型,以及静态标记与动态线程共享两种线程资源优化策略,深度剖析这些创新机制如何让 Zeta 引擎实现性能数倍提升。
设计方案说明
TaskExecutionServer 是一个用于执行 Task 的服务,会在每个节点上运行一个实例。 它接收来自 JobMaster 的 TaskGroup 并运行其中的 Task,还维护着 TaskID 到 TaskContext 的映射,具体的 Task 操作封装在 TaskContext 中。
Task 内部持有 OperationService,这意味着 Task 可以通过 OperationService 远程调用并与其他 Task 或 JobMaster 通信。
TaskGroup 设计
TaskGroup 中的所有任务都在同一个节点上运行。
优化点
同一个 TaskGroup 中任务之间的数据通道使用本地队列,而不同 TaskGroup 之间可能会使用分布式队列(如 Hazelcast 的 Ringbuffer),因为它们可能被分配到不同节点上执行。
任务执行状态反馈机制:基于call()
的ProgressState
返回
Task 中最关键的方法之一是 call()
,executor(执行器)通过反复调用 Task 的 call()
方法来驱动任务的执行。
该 call()
方法会返回一个 ProgressState
,执行器可以通过它判断任务是否已经结束,或者是否还需要继续调用。如下图所示:
线程共享两大优化策略
线程共享在需要同步大量小任务的场景中,会产生大量的任务。如果每个 Task 都使用一个线程,那会导致大量线程运行,造成资源浪费。
此时,如果能让一个线程运行多个 Task,就能大幅优化资源使用。
但问题在于,一个线程如何能执行多个任务?
由于 Task 是通过反复调用 call()
来驱动的,因此一个线程可以轮流调用它负责的多个 Task 的 call()
方法来实现并发执行。如下图所示:
但这也会带来一个问题:如果某个任务的 call()
执行时间非常长,该线程会被这个任务长时间占用,从而导致其它共享该线程的任务延迟严重。
为了解决这个问题,我想到以下两个优化策略:
策略一:标记 Thread Share(线程共享标记)
为 Task 提供一个标记,用于指示该任务是否支持线程共享。
在具体任务的实现中,由开发者评估和标记这个 Task 是否支持线程共享。
判断标准可以是 call()
方法的执行时间:如果始终在毫秒级以内,则可以将该任务标记为支持线程共享。
策略二:动态Thread Share(动态线程共享)
上述静态标记方案存在一个根本问题:call()
方法的执行时间通常不可预测,Task 自身也难以判断。
因为任务在不同阶段、处理的数据量不同,会直接影响 call()
的耗时。
因此,用固定标记来区分是否支持线程共享不够准确。
一旦某个标记为"可共享"的任务出现了长时间运行,就会严重影响其它任务。而不共享线程又会造成资源浪费的问题依然存在。
因此,建议采用动态线程共享机制:让一组任务通过一个线程池来调度执行(任务数 >> 线程数)。
当线程 thread1 执行 Task1 的 call()
方法时,如果执行时间超过设定值(如 100ms),就从线程池中取出 thread2 来执行 Task2 的 call()
。
这样就能避免因为 Task1 执行时间太长而影响其它任务的执行延迟。
如果 Task2 的 call()
方法在超时时间内正常完成,它会被重新放回队列尾部等待再次调度,thread2 则会继续从队列中取出下一个任务(如 Task3)执行。
当 Task1 的 call()
执行完后,thread1 会被释放回线程池,同时记录 Task1 的一次"超时"行为。
当一个任务的超时次数达到某个限制后,它将被从共享队列中移除,之后独占一个线程来执行。
相关执行流程如下:
随着任务执行模型的不断演进,Apache SeaTunnel 在高并发、小任务场景下的资源调度能力也在持续优化中。本文档提出的线程共享机制,既提升了执行效率,又保障了任务的响应性能,是Apache SeaTunnel Zeta 引擎性能比同类产品更快、性能复更高的重要因素。
如果你还有更好的想法,真诚欢迎你来 GitHub,提出你的 idea,参与共建更高效、更稳定的数据集成引擎!
本文由 白鲸开源科技 提供发布支持!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
百度日志中台前端重构实践
日志中台是百度内部针对打点数据的全生命周期管理平台,作为公司日志数据的唯一入口,承担以下核心职能:1.功能覆盖:提供从数据采集、传输、存储到查询分析的一站式服务,支持产品运营分析、研发性能监控、运维管理等多元场景。2.业务赋能:通过标准化流程实现用户行为日志的埋点申请、审批及退场管理,助力APP端、服务端等业务线挖掘数据价值。3.生态协同:与大数据平台、推荐中台、性能平台深度联动,避免重复建设,提升资源利用率,强化业务中台能力。 01 项目背景 2020年初启动的日志中台前端项目,随着业务发展逐渐暴露出严重问题。整个前端项目技术负债多,有500多个文件,共11万多行源码。项目已经变得老旧而臃肿。面临线上bug频发、排查问题效率低下等各种问题,陈旧的技术栈与低效的流程也制约了团队的生产力。因此需进行全面全面重构,通过基于业务导向的架构优化、开发测试流程规范化,从而提升前端开发效率,使项目具备长期稳健发展的技术基础。本文将重点介绍我在重构项目过程中的一些实践经验。 02 前端项目面临的问题 先介绍下日志中台前端项目的基本情况 核心框架:Vue 2.6 + Vuex 3.1.1 + VueR...
- 下一篇
HarmonyOS 代码工坊的指尖开发,让 APP 开发所见即所得
过去,移动端 APP 的开发,往往是开发者在桌面仿真界面上的一场“隔空演练”。 虽然市面上已经有一些简化开发的工具,可以在开发桌面提供模拟移动端效果的窗口,但终究不是真实的移动端设备。 现在,开发沙盘被直接搬入了移动设备本身。眼尖的开发者应该已经发现,最近华为应用市场“应用尝鲜”专区里,上架了一款名为“HarmonyOS 代码工坊”的新应用,下载量持续攀升。 开发者只需要下载“HarmonyOS 代码工坊”,就可以看到,这款 APP 内包含了各类 APP 应用开发所必备的组件,比如文本、弹窗、列表、AI 抠图、支付组件等等,以及各类交互效果、页面布局、其他系统应用拉起等内容。每一个功能都支持在手机上通过“拖拽”的方式,直接修改参数,开发者在真实的手机屏幕上滑动、选择,功能组件的呈现效果随之变化,所见即所得。 更关键的是,每一次精准的视觉调整或交互特效的打磨,其背后的实现代码都在随之变化,而这些代码也是直接呈现给开发者,只需要一键复制,便可以无缝注入开发者的个人 IDE 之中。从细微的 UI 控件到复杂的系统架构逻辑,移动端本身,已化身为一个可交互、可定制、并即时输出可靠代码的实体开发环...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Hadoop3单机部署,实现最简伪集群
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音