当前位置: 首页 > news >正文

Camunda流程引擎并发性能优化

文章目录

  • Camunda流程引擎
  • 一、JobExecutor
    • 1、工作流程
    • 2、主要作用
  • 二、性能问题
    • 1、实际场景:
    • 2、性能问题描述
    • 3、总结
  • 三、优化方案
    • 方案一:修改 Camunda JobExecutor 源码以实现租户 ID 隔离
    • 方案二:使用 max-jobs-per-acquisition 参数控制上锁数量


Camunda流程引擎

Camunda流程引擎的详细解读可以查看这篇文章:
https://blog.csdn.net/weixin_44876263/article/details/142332063?sharetype=blogdetail&sharerId=142332063&sharerefer=PC&sharesource=weixin_44876263&spm=1011.2480.3001.8118

一、JobExecutor

1、工作流程

  • 启动:当 Camunda 引擎启动时,JobExecutor 也随之启动,开始准备调度作业。

  • 查询作业:JobExecutor 定期调用 JobService,查询数据库中待执行的作业。这个查询会考虑作业的状态,比如是否被锁定,以避免并发执行。

  • 上锁:在查询到待执行作业后,JobExecutor 会为这些作业上锁,以确保其他实例无法同时处理同一个作业。这是通过更新数据库中的状态来实现的。

  • 执行作业:锁定后,JobExecutor 会尝试执行这些作业。执行过程中,它会处理任何异常情况,比如超时或执行失败。

  • 任务执行后的处理

    • 成功完成:如果作业成功执行,它将被标记为完成,随后从数据库中删除。
    • 失败处理:如果作业执行失败,根据配置,可以选择重试或记录错误。重试可能会有次数限制和延迟策略。
    • 后续执行:对于需要后续处理的作业,JobExecutor 会在失败时重新调度它们,确保它们能在未来的某个时刻再次被尝试执行。

2、主要作用

在 Camunda BPM 中,JobExecutor 是负责处理异步作业和定时作业的核心组件。它自动管理作业的调度和执行,确保系统能够高效地处理长时间运行的任务和事件。以下是 JobExecutor 的主要作用和功能:

  • 作业调度
    定期查询数据库,查找待执行的作业,包括异步作业和定时作业。

  • 作业执行
    在找到可执行的作业后,JobExecutor 会执行这些作业,确保系统能够按预期处理任务。

  • 并发处理
    支持并发执行多个作业,能够根据配置的线程池大小同时处理多个任务,提高系统的吞吐量。

  • 失败处理
    自动处理执行失败的作业,允许重试逻辑,以确保任务最终能够成功完成。

  • 灵活配置
    可以根据业务需求配置作业的执行频率、并发数量等参数,以优化性能。

二、性能问题

1、实际场景:

在正式的多服务器环境中,当并发产生 1000 个任务实例时,这些任务会被存储为待执行的任务在数据库中。当 JobExecutor 调用 JobService 查询数据库中的待执行任务时,可能会出现以下性能问题:

2、性能问题描述

1、任务并发产生:

  • 在高并发情况下,同时产生 1000 个任务实例,所有任务会迅速积累为待执行状态,增加数据库中的任务总数。

2、查询和上锁机制:

  • 当 JobExecutor 启动并查询待执行的任务时,可能存在某一台服务器一次性获取所有可用任务的情况,导致该服务器迅速上锁大量任务。

3、负载不均衡:

  • 一旦某台服务器获取了大量任务,其他服务器则可能无法获取任务。这种资源分配不均衡会导致部分服务器过载,而其他服务器处于闲置状态,无法充分利用集群资源。

4、性能瓶颈:

  • 随着某台服务器处理所有获取的任务,可能导致该服务器的 CPU、内存等资源消耗过高,从而引发性能瓶颈。此外,数据库也可能因频繁的高负载查询而变得响应缓慢,影响整体系统性能。

3、总结

在考虑多服务器环境下的任务处理时,可能面临以下性能问题:

1. 任务竞争

  • 问题:多个 JobExecutor 实例可能同时争抢相同的作业,导致锁竞争和资源冲突。
  • 影响:竞争会增加数据库负担,降低任务处理效率,导致响应时间延长。

2. 负载不均衡

  • 问题:在使用 max-jobs-per-acquisition 时,某些 JobExecutor 可能会获得更多任务,而其他实例则可能处于闲置状态。
  • 影响:这种不均衡会导致资源利用率降低,可能出现某些服务器过载,而其他服务器闲置的情况。

3. 数据库压力

  • 问题:频繁的数据库查询和作业获取请求可能导致数据库负载增加。
  • 影响:高负载可能导致数据库性能下降,进而影响整体系统的稳定性和响应速度。

4. 任务执行延迟

  • 问题:由于上锁数量或任务竞争的限制,任务的执行可能受到延迟。
  • 影响:延迟会影响用户体验和业务流程的及时性,尤其是在实时性要求较高的场景中。

5. 扩展性问题

  • 问题:随着任务数量的增加,现有的调度和执行机制可能无法有效扩展。
  • 影响:系统可能无法承受更高的负载,导致性能瓶颈和资源浪费。

三、优化方案

提高多服务器环境下的任务处理效率,确保任务的隔离性与资源利用的平衡

方案一:修改 Camunda JobExecutor 源码以实现租户 ID 隔离

  • 目标:

    为每台服务器指定一个租户 ID,使得每台服务器仅能查询和处理其对应租户的任务,从而提高任务的隔离性和资源利用效率。

  • 实现步骤:

    1. 租户 ID 支持:

      • 在 JobExecutor 中引入租户 ID 的概念,使其能够识别和区分不同租户的作业。
    2. 查询作业时的过滤:

      • 在作业查询逻辑中,增加对租户 ID 的过滤,确保每台服务器仅获取与其租户 ID 相关的作业。
    3. 数据库查询修改:

      • 根据需要调整相关数据库查询,以支持租户 ID 的使用。
  • 优点:

    1. 高隔离性:每个服务器只处理特定租户的任务,显著降低了任务之间的竞争。
    2. 管理灵活性:可以独立管理各个租户的负载,便于监控和维护。
  • 缺点:

    1. 维护复杂性:需要维护自定义源码,增加了系统的复杂性。
    2. 升级难度:在升级 Camunda 时,可能需要重新合并修改的代码,增加了维护成本。

代码实现示例:

  1. 租户 ID 支持,创建实例时引入租户概念:
    在这里插入图片描述
  2. 查询作业时的过滤:
  • 修改org.camunda.bpm.engine.impl.persistence.entity.JobManager中的findNextJobsToExecute方法
    在这里插入图片描述
  1. 数据库查询修改:
  • 修改org.camunda.bpm.engine.impl.persistence.entity.JobEntity中的selectNextJobsToExecute查询待执行任务方法
    在这里插入图片描述

方案二:使用 max-jobs-per-acquisition 参数控制上锁数量

  • 目标:
    通过设置 max-jobs-per-acquisition 参数,控制每次获取作业时的上锁数量,以避免单台服务器获取过多任务。

  • 实现步骤:

    1. 配置参数:

      • 在 Camunda 的配置文件中设置 max-jobs-per-acquisition,例如:
      camunda:bpm:job-execution:max-jobs-per-acquisition: 10  # 每次从数据库中查询时,最多锁定并执行 10 个作业
      
    2. 任务调度:

      • 确保系统根据这个参数进行作业调度,以控制并发作业的处理。
  • 优点:

    1. 简单易行:
      • 不需要修改源码,便于快速调整系统配置。
    2. 灵活性:
      • 能够根据需求迅速调整上锁数量,以优化性能。
  • 缺点:

    1. 竞争可能性:
      • 多个 JobExecutor 实例可能同时查询相同的作业,导致资源竞争加剧,特别是在高负载情况下。
    2. 负载不均:
      • 由于任务调度是随机的,可能导致某些 JobExecutor 获取更多任务,而其他实例闲置,造成资源利用不均。

相关文章:

Camunda流程引擎并发性能优化

文章目录 Camunda流程引擎一、JobExecutor1、工作流程2、主要作用 二、性能问题1、实际场景:2、性能问题描述3、总结 三、优化方案方案一:修改 Camunda JobExecutor 源码以实现租户 ID 隔离方案二:使用 max-jobs-per-acquisition 参数控制上锁…...

spring springboot 日志框架

一、常见的日志框架 JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j.... 注意:SLF4j 类似于接口 Log4j ,Logback 都是出自同一作者之手 JUL 为apache 公司产品 Spring(commons-logging)、Hibernate(jboss…...

【D3.js in Action 3 精译_022】3.2 使用 D3 完成数据准备工作

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可视化最佳实践(下)1.4 本章小结 第二章…...

电脑怎么禁用软件?5个方法速成,小白必入!

电脑禁用软件的方法多种多样,以下是五种简单易行的方法. 适合不同需求的用户,特别是电脑小白。 1. 使用任务管理器禁用启动项 操作步骤:按下“Ctrl Shift Esc”组合键,打开任务管理器。 切换到“启动”选项卡,找到…...

力扣之181.超过经理收入的员工

文章目录 1. 181.超过经理收入的员工1.1 题干1.2 准备数据1.3 题解1.4 结果截图 1. 181.超过经理收入的员工 1.1 题干 表:Employee -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | | salary | int | | mana…...

C++语法应用:从return机制看返回指针,返回引用

前言 编程是极其注重实践的工作,学习的同时要伴随代码 引入 此前对返回指针和引用有一些纠结,从return角度来观察发生了什么。 return机制 函数中return表示代码结束,如果return后面有其他代码将不被执行。 return发生了值转移,return后面的…...

Linux5-echo,>,tail

1.echo命令 echo是输出命令,类似printf 例如:echo "hello world",输出hello world echo pwd,输出pwd的位置。是键盘上~ 2.重定向符> >> >指把左边内容覆盖到右边 echo hello world>test.txt >…...

sqlgun靶场训练

1.看到php?id ,然后刚好有个框,直接测试sql注入 2.发现输入1 union select 1,2,3#的时候在2处有回显 3.查看表名 -1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()# 4.查看列名…...

简化登录流程,助力应用建立用户体系

随着智能手机和移动应用的普及,用户需要在不同的应用中注册和登录账号,传统的账号注册和登录流程需要用户输入用户名和密码,这不仅繁琐而且容易造成用户流失。 华为账号服务(Account Kit)提供简单、快速、安全的登录功能,让用户快…...

【研发日记】嵌入式处理器技能解锁(六)——ARM的Cortex-M4内核

文章目录 前言 背景介绍 指令集架构 ARM起源 ARM分类 Cortex-M4 内核框架 指令流水线 实践应用 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(…...

深度学习经典模型之T5

T5(Text-to-Text Transfer Transformer) 是继BERT之后Google的又外力作,它是一个文本到文本迁移的基于Transformer的NLP模型,通过将 所有任务统一视为一个输入文本并输出到文本(Text-to-Text)中,即将任务嵌入在输入文本中,用文本的…...

10.第二阶段x86游戏实战2-反编译自己的程序加深堆栈的理解

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

ARM总复习

1.计算机的组成 输入设备 输出设备 存储设备 运算器 控制器、总线 2.指令和指令集 2.1 机器指令 机器指令又叫机器码,在运算器内部存在各种运算电路,当处理器从内存中获取一条机器指令,就可以按照指令让运算器内部的指定的运算电路进行运…...

​​使用ENVI之大气校正(下)

再根据遥感影像的拍摄时间将Flight ate与Flight Time GMT (H:M:SS)填写,如要查询按如下方法 这里按照表中的内容修改 根据影像范围的经纬度与拍摄时间更改Atmospheric Model,更改完成后点击Multispectral Settings...在跳出的界面中选择GUI再点击Default…...

C++(学习)2024.9.18

目录 C基础介绍 C特点 面向对象的三大特征 面向对象与面向过程的区别 C拓展的非面向对象的功能 引用 引用的性质 引用的参数 指针和引用的区别 赋值 键盘输入 string字符串类 遍历方式 字符串与数字转换 函数 内联函数 函数重载overload 哑元函数 面向对象基…...

认知小文2《成功之路:习惯、学习与实践》

内容摘要: 在这个充满机遇的时代,成功不再是偶然,而是可以通过培养良好习惯、持续学习和实践来实现的目标。    一、肌肉记忆:技能的基石 成功往往需要像运动员一样,通过日复一日的练习来形成肌肉记忆。无论是健身…...

【数据仓库】数据仓库层次化设计

一、基本概念 **1. RDS(RAW DATA STORES,原始数据存储)** RDS作为原始数据存储层,用于存储来自各种源头的未经处理的数据。这些数据可能来自企业内部的业务系统、外部数据源或各种传感器等。RDS确保原始数据的完整性和可访问性&…...

【DAY20240918】03教你轻松配置 Git 远程仓库并高效推送代码!

文章目录 前言 git diff一、远程仓库?1、在 Gitee 上新建仓库:2、Git 全局设置:3、添加远程仓库:4、推送本地代码到远程仓库:5、输入用户名和密码:6、后续推送: 二、全情回顾三、参考 前言 git …...

从IPC摄像机读取视频帧解码并转化为YUV数据到转化为Bitmap

前言 本文主要介绍根据IPC的RTSP视频流地址,连接摄像机,并持续读取相机视频流,进一步进行播放实时画面,或者处理视频帧,将每一帧数据转化为安卓相机同格式数据,并保存为bitmap。 示例 val rtspClientListener = object: RtspClient.RtspClientListener {override fun …...

LeetCode 面试经典 150 题回顾

目录 一、数组 / 字符串 1.合并两个有序数组 (简单) 2.移除元素 (简单) 3.删除有序数组中的重复项 (简单) 4.删除有序数组中的重复项 II(中等) 5.多数元素(简单&am…...

【网络安全的神秘世界】渗透测试基础

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 渗透测试基础 基于功能去进行漏洞挖掘 1、编辑器漏洞 1.1 编辑器漏洞介绍 一般企业搭建网站可能采用了通用模板&#xff…...

【重学 MySQL】二十九、函数的理解

【重学 MySQL】二十九、函数的理解 什么是函数不同 DBMS 函数的差异函数名称和参数功能实现数据类型支持性能和优化兼容性和可移植性 MySQL 的内置函数及分类单行函数多行函数(聚合函数)使用注意事项 什么是函数 函数(Function)在…...

MySQL5.7主从复制搭建-gtid方式

环境准备 1、主机名和和IP地址如下 10.0.0.51 db01.ljbb.com 10.0.0.52 db02.ljbb.com 10.0.0.53 db03.ljbb.com2、配置文件 db01 [mysqld] usermysql basedir/app/mysql datadir/data/mysql/data socket/tmp/mysql.sock server_id51 port3306 secure-file-priv/tmp autoco…...

golang学习笔记22——golang微服务中数据竞争问题及解决方案

推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

yolo训练出现Could not load library libcudnn_cnn_train.so.8问题及解决方法

问题场景: 训练yolov5或者yolov8时候会报错: Could not load library libcudnn_cnn_train.so.8. Error: /usr/local/cuda-12.1/lib64/libcudnn_cnn_train.so.8: uined symbol: _ZN5cudnn3cnn34layerNormFwd_execute_internal_implERKNS_7backend11Vari…...

携手科大讯飞丨云衔科技为企业提供全栈AI技术解决方案

作为智能时代的核心驱动力,人工智能不仅重塑了传统行业的面貌,更开辟了全新的经济增长点。科大讯飞以其深厚的技术底蕴和创新能力,持续引领着人工智能领域的发展潮流。云衔科技作为科大讯飞开放平台的AI技术产品线合作伙伴代理商,…...

57页PPT | 智慧文旅整体建设解决方案

主要介绍了智慧文旅的建设背景、需求分析、解决方案、应用系统功能需求、客户价值、企业价值、建设理念、建设思路、总体架构、安全管理体系、融媒体综合服务平台、大数据分析平台、智慧文旅云平台、智慧管理、智慧营销、智慧服务等方面的内容。 背景及需求分析 方案架构及理念…...

线性代数之QR分解和SVD分解

文章目录 1.QR分解Schmidt正交化Householder变换QR分解的应用 2. 求矩阵特征值、特征向量的基本方法3.SVD分解SVD分解的应用 参考文献 1.QR分解 矩阵的正交分解又称为QR分解,是将矩阵分解为一个正交矩阵Q和一个上三角矩阵R的乘积的形式。 任意实数方阵A&#xff0c…...

在虚拟机安装mysql数据库

一、安装步骤(下载包-传输软件包-安装包-启用仓库-使用yum安装服务器) 1、要在mysql官网下载yum仓库包 2、下载好rpm包后,将其通过xftp传输到root目录下 3、使用sudo yum install yum的仓库名(sudo yum install mysql-community-…...

详解QT插件机制

Qt插件机制允许将功能模块化为独立的插件,从而在运行时动态加载和卸载这些模块。这种机制对于扩展应用程序、插件架构和动态功能添加非常有用 插件机制 插件的基本概念 插件: 在Qt中,插件是实现特定接口的动态库(DLL或so文件),这些接口由Qt插件框架定义。插件可以被应用程序…...