如何对Camunda进行历史数据清理

前言

本文基于Camunda7.12版本进行介绍,版本过新或者过旧可能存在差异,请结合官方文档分析。

Camunda简介

官方介绍,Camunda是基于Java语言,支持BPMN标准的工作流和流程自动化框架,并且还支持CMMN规范,DMN规范。具体Camunda的内容这里不做过多介绍,接下来分享一下在SpringBoot集成Camunda之后如何进行历史数据清理。

Camunda历史数据

因为Camunda大量使用运行的过程中,流程引擎会产生大量的历史数据,所以Camunda提供了通用的能力来删除历史数据。支持删除的历史数据包括Process Instances、Decision Instances、Case Instances、Batches:

Historic process instances plus all related historic data (e.g., historic variable instances, historic task instances, all comments and attachments related to them, etc.)
Historic decision instances plus all related historic data (i.e., historic decision input and output instances)
Historic case instances plus all related historic data (e.g., historic variable instances, historic task instances, etc.)
Historic batches plus all related historic data (historic incidents and job logs)

历史数据清理既支持手动触发(仅Camunda管理员有权)也支持定期计划清理,后者使用场景比较多,这里仅介绍后者定期清理的配置实现。

清理策略

关于清理的基准,Camunda也提供了两种策略供用户选择,分别是基于删除时间的策略和基于结束时间的策略。

1.基于删除时间的策略

基于历史纪录的removal_time_移除时间,删除过期的数据

优点:

    1.每个历史表里都有removal_time_这个字段,因此通过delete from <table> where removal_time_ < <now> 这样一个简单的sql就可以完成历史纪录的清理。比基于结束时间的策略清理效率高

    2.移除时间对于层次结构中所有实例都是一致的,当到达移除时间,就会完全清除层次结构,而不会在不同时间删除实例。

缺点:

    1.只能删除已经设置删除时间的数据。(不过这个问题可以通过刷一下数据库解决,给历史数据刷上removal_time_的值)。另外官方说明对于Camunda版本<7.10.0,可能是不支持的。

    2.如果你更新了TTL(历史记录生存时间,后文会介绍),它不会动态刷新已经写入removal_time_的数据。但是可以通过Camunda提供的批处理操作设置移除时间。

    3.案例实例的历史数据不会清理。(官方给出,原因不明)

2.基于结束时间的策略

基于结束时间的策略是通过计算结束时间加上TTL,获取已过期的历史记录。这种方式每执行一次历史记录清理就会计算一次。

优点:

    1.对比基于删除时间的策略的缺点2,基于结束时间的策略更改定义的TTL可以影响已经写入的历史数据。

    2.对比前一策略缺点1,该策略可以从任何Camunda版本中删除数据

缺点:

    1.结束时间仅存储在实例表,基于结束时间的策略的底层实现方式,需要通过一条select语句获取所有可以清理的实例,然后再为实例关联的历史表创建删除sql,因此语句可能会涉及级联。相比较基于移除时间的策略效率会更低。

    2.由于各个实例结束时间不同,实例层次结构不会同时整体清除。

参数配置

1.历史记录生存时间(TTL)

Time to live,该值定义历史数据在清理之前可以保存在数据库中的时间。
batchOperationHistoryTimeToLive和historyTimeToLive两个字段都表示TTL,但是具体区别我没能从官方文档中理解出来,所以我目前两个都进行了配置。如果有同学理解,欢迎分享。P90D表示90天。

<property name="batchOperationHistoryTimeToLive">P90D</property>
<property name="historyTimeToLive">P90D</property>

2.清理窗口

英文名称叫做Cleanup Window,其实就是清理时间段,可以指定每一天,也可以指定每周的某一天。

<!-- default for all weekdays -->
<property name="historyCleanupBatchWindowStartTime">20:00</property>
<property name="historyCleanupBatchWindowEndTime">06:00</property>

<!-- overriding batch window for saturday and sunday -->
<property name="saturdayHistoryCleanupBatchWindowStartTime">06:00</property>
<property name="saturdayHistoryCleanupBatchWindowEndTime">06:00</property>
<property name="sundayHistoryCleanupBatchWindowStartTime">06:00</property>
<property name="sundayHistoryCleanupBatchWindowEndTime">06:00</property>

3.清理策略

这个就是选择基于移除时间的策略还是基于结束时间的策略,removalTimeBased或者endTimeBased

<property name="historyCleanupStrategy">removalTimeBased</property>

4.移除时间策略

移除时间定义为removal time = base time + TTL。其中的base time可以是实例的开始时间也可以是结束时间。这一项就是对于此选择的配置。

<property name="historyRemovalTimeStrategy">end</property>

有效值为start,end和none。end是默认值和推荐选项。start当流程引擎填充历史记录表时,它效率更高一点,因为UPDATE在实例完成时它不必执行额外的语句。

5.并行作业数

这一项是指Camunda用于历史记录清理的并行执行程度,有效值为1到8的整数,1是默认值。该值定义了一次有多少作业执行程序线程处理历史记录清理。选择较高的值可以加快清除速度,但当然可能会占用其他执行资源。

<property name="historyCleanupDegreeOfParallelism">4</property>

6.单次批量处理实例数

一个清理事务中删除的实例数,默认值也是最大值,为500

<property name="historyCleanupBatchSize">100</property>

7.历史记录级别

The history level controls the amount of data the process engine provides via the history event stream.

这项配置用于控制流程引擎通过历史事件流提供的数据量,官网并没有说明这个配置和历史纪录清理之间的关系,但是经过我的测试,如果没有配置为full,我这里的历史纪录清理无法生效,所以附在这里,供各位参考。

<property name="history">full</property>

实战

我在项目里选用了基于移除时间的清理策略,我们是SpringBoot集成Camunda,通过applicaiton.yml配置如下:

# camunda历史清理配置
camunda:
    bpm:
        generic-properties:
            properties:
            	# 历史记录级别设置
                history: full
                # 批量清理运行时间窗口:设置在每天20:00-22:00
                # historyCleanupBatchWindowStartTime: "20:00"
                # historyCleanupBatchWindowEndTime: "22:00"

                # 批量清理运行时间窗口:设置在周日18:00-22:00
                sundayHistoryCleanupBatchWindowStartTime: "18:00"
                sundayHistoryCleanupBatchWindowEndTime: "22:00"

                # 清理策略:基于移除时间
                historyCleanupStrategy: removalTimeBased

                # 基于移除时间清理策略,进一步基于开始/结束时间+TTL计算removal_time_
                historyRemovalTimeStrategy: start
                # historyRemovalTimeStrategy: end

                # TTL 生存时间 90天
                batchOperationHistoryTimeToLive: P90D

                historyTimeToLive: P90D

                # 用于历史清理的并行作业数,后期可以调小该数据
                historyCleanupDegreeOfParallelism: 4

                # 单次批量处理实例数
                historyCleanupBatchSize: 100

设置之后每执行一次实例,生成的记录都会带有removal_time_一值,计算方式为开始时间+90天。
移除时间自动生成
在项目正常运行的过程中,会在设置的清理窗口时间内进行清理,注意可能并不会在你设置的时间一开始就看到数据被清理掉。后台执行清理任务需要耗时,请耐心等待一下。

另外假如确实遇到配置不生效的问题,可以在项目启动的时候debug一下org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl这个类,这个类应当是用于加载camunda配置的。


最后附上官方文档链接:https://docs.camunda.org/manual/7.12/user-guide/process-engine/history/

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值