我一直在评估camunda在我的Tomcat应用程序中使用 embedded 几天但是我提出了一些关于受让人和变量的性能担忧,以进一步过滤我的存储库。有一些简单的用例场景对我来说很实用:
1)过滤分配给特定用户的所有活动任务。
2)过滤与客户关联的所有活动流程实例。
3)从与客户关联的流程实例中过滤所有活动任务。
所以我更关心的是:
a - 我是否可以依赖具有数据库索引的用例1,以便将来能够很好地执行高度填充的任务表?
b - 要完成用例2,我会将客户ID作为流程级变量添加到我的流程实例中,以进一步过滤它们。 变量是否也需要编入索引 - 假设受让人是? (假设我需要查询具有给定变量集的100万个进程表中的20个进程)
c - 最后,从性能的角度来看,我应该在每个任务中复制客户ID变量,然后在不检查相应流程实例的情况下过滤它们吗?
ps1:我使用postgres数据库作为存储库,并且没有完全理解BPM引擎下面的底层结构和索引。如果需要一些理解来创建默认情况下不可用的索引,我会很感激我应该处理哪些表/列的线索。
ps2:我不是在处理关键的并发软件,但在不久的将来可能会有大量的数据库负载。
答案 0 :(得分:1)
如果您对数据库结构等感兴趣,您可以查看一些内容。数据库结构在[1]
中描述您还可以通过查看预打包的发行版来查看数据库创建脚本。对于Tomcat,请查看文件夹sql / create。
回答您的具体问题; 有一个名为ACT_RU_TASK的表。这有运行时任务。查看Postgresql的SQL脚本,ACT_RU_TASK(ASSIGNEE_)上有一个索引ACT_IDX_TASK_ASSIGNEE。因此看起来任务受让人都有一个索引。
变量稍微复杂一些,因为变量类型可能决定它实际存储的位置。
businessKey上有一个索引,因此如果您使用businessKey存储客户ID,您可能会从businessKey获得一些牵引力。
除了必要时在适当的位置添加索引之外,另一种要考虑的技术是添加自己的表,这是引擎的索引。例如,使用任务或流程生命周期事件侦听器等,您可以使用查找值使表保持最新。因此,您可以保留一个客户ID和流程或任务ID表,或某个变量和任务ID等。一旦表格到位,您可以添加客户sql或插件来使用该功能。
[1] https://docs.camunda.org/manual/7.4/user-guide/process-engine/database/
(Webcyberrob在https://forum.camunda.org/t/performance-and-indexes-in-camunda-process-repository/650回答)