1、用于高并发性的UUID ID生成器

在某些非常高的并发负载情况下,由于无法足够快地获取新的ID块,因此缺省ID生成器可能会导致异常。每个流程引擎都有一个ID生成器。默认ID生成器在数据库中保留一个ID块,使得其他引擎不能使用来自同一块的ID。在引擎操作期间,当默认ID生成器注意到ID块被用完时,开始新事务以获取新块。在(非常)有限的使用情况下,当真正的高负载时,这可能会导致问题。对于大多数使用情况来说,默认的ID生成器已经足够了。缺省值org.flowable.engine.impl.db.DbIdGenerator还有一个属性idBlockSize,可以配置该属性来设置保留的ID块的大小,并调整ID取回的行为。

默认ID生成器的替代方案是org.flowable.engine.impl.persistence.StrongUuidGenerator,它在本地生成唯一的UUID,并将其用作所有实体的标识符。由于UUID是在不需要数据库访问的情况下生成的,因此可以更好地处理并发用例。请注意,性能可能与默认ID生成器(正面和负面)有所不同,具体取决于机器。

UUID生成器可以在Flowable配置中设置如下:

<property name="idGenerator">
<bean class="org.flowable.engine.impl.persistence.StrongUuidGenerator" />
</property>

UUID ID生成器的使用具有以下额外的依赖性:

<dependency>
<groupId>com.fasterxml.uuid</groupId>
<artifactId>java-uuid-generator</artifactId>
<version>3.1.3</version>
</dependency>

2、多租户

一般而言,多租户是软件能够为多个不同组织提供服务的概念。关键是数据是分区的,没有组织可以看到其他数据。在这种情况下,这样一个组织(或者一个部门,或者一个团队,或者别的什么的,就叫做租户。

请注意,这与多实例安装程序(其中Flowable Process引擎实例正在为每个组织单独运行(并使用不同的数据库架构))有根本的不同。虽然Flowable是轻量级的,并且运行Process Engine实例不需要太多资源,但确实增加了复杂性和更多的维护。但是,对于一些使用情况来说,这可能是正确的解决方案。

在Flowable中多租户主要是围绕数据分区来实现的。请注意,Flowable不强制执行多租户规则。这意味着在查询和使用数据时不会验证执行操作的用户是否属于正确的租户。这应该在调用Flowable引擎的层中完成。Flowable确保在检索过程数据时可以存储和使用租户信息。

将流程定义部署到Flowable Process引擎时,可以传递租户标识符。这是一个字符串(例如UUID,部门ID等),限制为256个字符,唯一标识租户:

repositoryService.createDeployment()
.addClassPathResource(...)
.tenantId("myTenantId")
.deploy();

在部署期间传递租户ID具有以下含义:

  • 包含在部署中的所有流程定义将继承此部署中的租户标识符。
  • 从这些流程定义开始的所有流程实例从流程定义中继承此租户标识符。
  • 执行流程实例时在运行时创建的所有任务将从流程实例继承此租户标识符。独立任务也可以有一个租户标识符。
  • 在流程实例执行期间创建的所有执行从流程实例中继承此租户标识符。
  • 可以在提供租户标识符的同时触发信号抛出事件(在流程本身或通过PI)。该信号只能在租户上下文中执行:即如果有多个同名的信号捕获事件,则实际上只会调用具有正确租户标识的信号。
  • 所有作业(定时器和异步继续)从流程定义(例如定时器启动事件)或流程实例(在作业在运行时创建,例如异步继续)继承承租人标识符。这可能会被用来优先考虑一些定制的工作执行者的租户。
  • 所有历史实体(历史流程实例,任务和活动)都从其运行时对象继承了租户标识符。
  • 作为一个方面说明,模型也可以有一个租户标识符(模型被Flowable建模者用来存储BPMN 2.0模型)。

为了实际利用流程数据上的租户标识符,所有查询API都可以在租户上进行过滤。例如(可以被其他实体的相关查询实现替换):

runtimeService.createProcessInstanceQuery()
.processInstanceTenantId("myTenantId")
.processDefinitionKey("myProcessDefinitionKey")
.variableValueEquals("myVar", "someValue")
.list()

查询API也允许用类似的语义过滤租户标识符,也可以过滤掉没有租户标识的实体。

重要的实现细节:由于数据库怪癖(更具体地说:在唯一约束中的空处),指示没有租户的默认承租人标识符值是空字符串。(流程定义键,流程定义版本,租户标识符)的组合必须是唯一的(并且有一个数据库约束检查这个)。另请注意,租户标识符不应设置为空,因为这将影响查询,因为某些数据库(Oracle)将空字符串视为空值(这就是为什么查询 .withoutTenantId检查空字符串或null)。这意味着可以为多个租户部署相同的流程定义(具有相同的流程定义键),每个租户都有自己的版本。这不会影响不使用租赁时的使用情况。

请注意,以上所有内容与在群集中运行多个可流式实例都没有冲突。

(String deploymentId,String newTenantId)方法来更改租户标识符。这将改变之前被继承的任何地方的租户标识符。从非多租户设置转到多租户配置时,这非常有用。有关更多详细信息,请参阅Javadoc的方法。

上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:

Flowable入门系列文章187 - 高并发性的UUID ID生成器和多租户相关推荐

  1. Flowable入门系列文章193 - 禁用批量插入和安全脚本

    1.禁用批量插入 默认情况下,引擎将在批量插入中将同一数据库表的多个插入语句组合在一起,从而提高性能.已经针对所有支持的数据库进行了测试和实施. 但是,它可能是受支持和测试过的数据库的特定版本,不允许 ...

  2. Flowable入门系列文章11 - Flowable API 01

    1.Process Engine API和服务 引擎API是与Flowable进行交互的最常见的方式.主要的出发点是ProcessEngine,可以按照配置部分所述的几种方式创建 .从 Process ...

  3. Flowable入门系列文章86 - Flowable Modeler应用程序

    Flowable Modeler应用程序可用于对BPMN流程,DMN决策表,表单定义和创建应用程序定义进行建模.BPMN建模人员使用与Flowable 5 中相同的Oryx和Angular基础,但是现 ...

  4. Flowable入门系列文章47 - 电子邮件任务

    Flowable允许您通过向一个或多个收件人发送电子邮件的自动邮件服务任务来增强业务流程,包括支持cc,bcc,HTML内容等.请注意,邮件任务不是 BPMN 2.0规范的正式任务(因此没有专门的图标 ...

  5. Flowable入门系列文章195 - JMX的组态和服务URL

    1.组态 JMX使用默认配置,以便于使用最常用的配置进行部署.但是,更改默认配置很容易.您可以通过编程或通过配置文件来完成.下面的代码片段显示了如何在配置文件中完成这个工作: <bean id= ...

  6. Flowable入门系列文章35 - Activity解读 11

    1.消息中间捕捉事件 描述 中间捕获 消息事件捕获具有指定名称的消息. 图形表示法 中间捕捉消息事件可视化为一个典型的中间事件(圆圈内有较小的圆圈),里面有消息图标.消息图标是白色(未填充),以指示其 ...

  7. Flowable入门系列文章194 - JMX的基本介绍和属性说明

    1.介绍 可以使用标准的Java管理扩展(JMX)技术连接到Flowable引擎,以获取信息或更改其行为.任何标准的JMX客户端都可以用于这个目的.启用和禁用Job Executor,部署新的流程定义 ...

  8. Flowable入门系列文章49 - 骡子任务

    mule任务允许你发送消息给mule,增强了Flowable的集成功能.请注意,Mule任务不是 BPMN 2.0规范的正式任务(因此没有专门的图标).因此,在Flowable中,mule任务被实现为 ...

  9. Flowable入门系列文章90 - 一般可流动的REST原则 01

    1.安装和认证 Flowable包含一个REST API给Flowable引擎,可以通过将flowable-rest.war文件部署到像Apache Tomcat这样的servlet容器来安装.但是, ...

  10. Flowable入门系列文章42 - 用户任务

    1.描述 一个用户任务被用来模拟需要由人来完成的工作.当进程执行到达这样的用户任务时,在分配给该任务的任何用户或组的任务列表中创建新的任务. 2.图形表示法 用户任务可视化为一个典型的任务(圆角矩形) ...

最新文章

  1. 使用R语言对照片人物进行情绪分析
  2. android 缩略图uri_课题_android系统通过图片绝对路径获取URI的三种方法
  3. MybatisPlus操作模板
  4. Chrome 100发布:全新图标,CPU、内存占用暴降!
  5. SOTA级发丝抠图模型PP-Matting开源,支持多场景精细化分割
  6. 如何免费获取基于公网 IP 的 SSL 证书 (无需域名)
  7. 紫光扫描仪ocr_清华紫光扫描仪的安装教程及使用方法
  8. python量化投资系统构建_零基础搭建量化投资系统 以Python为工具
  9. SQLSERVER Agent XPs disable
  10. 【IJCAI 2016】Modularity Based Community Detection with Deep Learning 阅读小记
  11. 正斜杠 “/” 与反斜杠 “\”辨析
  12. IDaaS储备知识5 - 扫码登录
  13. Forever小浮的数学推公式专题题解
  14. java开发简单解释器,实现一个简单的解释器(5)
  15. elasticsearch安装部署教程
  16. @JsonFormat将时间字符串2021-02-25T15:32:54+08:00解析成date
  17. 十一假期,我在头等舱里,看到了自已贫穷的真相!
  18. 【IoT】产品设计之行业动态:社区团购:巨头们会放弃卖菜这门生意吗?
  19. Python技法之简单递归下降Parser的实现方法
  20. Vue 解决文字闪动

热门文章

  1. opencv-3.4.2-vc14_vc15.exe 下载
  2. To be a tough man
  3. 开机未发现nvidia控制面板_电脑没有NVIDIA控制面板怎么办
  4. 编码的奥秘:存储器组织
  5. 我为NET狂~群福利:逆天书库
  6. Java图书管理系统(控制台程序)
  7. 集体智慧编程——搜索与排名
  8. 《信号与系统》解读 前言:经典教材的选择
  9. 微软ODBC服务器驱动,Microsoft SQL Server ODBC 驱动程序修复
  10. 电商后台管理系统项目总结(一)