当前位置: 首页 > 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…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...