Flowable入门系列文章64 - 独家工作

在最近的版本中,JobExecutor确保来自单个流程实例的作业永远不会同时执行。为什么是这样?

为什么独占工作?

考虑下面的流程定义:
在这里插入图片描述

我们有一个并行的网关,然后是三个服务任务,它们都执行异步延续。由此,三个作业被添加到数据库中。一旦这样的工作出现在数据库中,它可以由JobExecutor处理。JobExecutor获取作业并将其委托给实际处理作业的工作线程的线程池。这意味着通过使用异步延续,可以将工作分配到此线程池(甚至在群集中的多个线程池中也可以在群集方案中)。这通常是一件好事。但是,它也有一个固有的问题:一致性。考虑服务任务之后的并行连接。当一个服务任务的执行完成时,我们到达并行连接,需要决定是否等待其他执行或是否可以前进。

为什么这是个问题?由于服务任务是使用异步延续进行配置的,因此可能同时获取相应的作业,并由JobExecutor将其委托给不同的工作线程。结果是执行服务的事务以及三个独立执行到达并行连接的事务可以重叠。如果他们这样做,每个单独的事务将不会“看到”,另一个事务同时到达相同的并行连接,因此认为它必须等待其他事务。但是,如果每个事务都假定需要等待其他事务,那么在并行连接之后没有任何事务将继续进行,并且流程实例将永远保持该状态。

Flowable如何解决这个问题?流动性执行乐观锁定。每当我们根据可能不是最新的数据做出决定(因为另一个事务可能会在我们提交之前修改它),我们确保在两个事务中增加相同数据库行的版本。通过这种方式,无论哪个事务提交首先获胜,其他人都失败并出现乐观锁定异常。这解决了上面讨论的过程中的问题:如果多个执行同时到达并行加入,他们都假定他们必须等待,递增其父执行(流程实例)的版本,然后尝试提交。无论哪个执行是第一个将能够提交,其他人将失败,乐观的锁定异常。由于执行是由工作触发的,这是一个很好的解决方案?正如我们所看到的,乐观锁定允许Flowable防止不一致。它确保我们不会“停留在加入网关”,即:所有执行都通过了网关,或者数据库中有作业,确保我们重试通过它。然而,从持续性和一致性的角度来看,这是一个完美的解决方案,但这并不总是在更高层次上的理想行为:

  • Flowable将只重试同样的工作,只有固定的最大次数(默认配置下是3)。之后,这个工作仍然存在于数据库中,但不会再被主动重试。这意味着外部操作员需要手动触发作业。
  • 如果一项工作有非交易性的副作用,这些将不会由失败的交易回滚。例如,如果“预订演唱会门票”服务与“Flowable”不共享相同的交易,那么如果我们重新尝试工作,我们可能会预订多张门票。

什么是独家工作?
独占作业不能与同一过程实例中的另一个独占作业同时执行。考虑上面显示的过程:如果我们声明服务任务是独占的,那么JobExecutor将确保相应的作业不被同时执行。相反,它将确保每当从某个流程实例获得排他性作业时,它将从同一个流程实例获取所有其他排他性作业,并将它们委托给同一个工作线程。这确保了作业的顺序执行。

我怎样才能启用这个功能?在最近的版本中,独占作业是默认配置。所有异步延续和计时器事件在默认情况下都是独占的。另外,如果你想要一个工作是非排他性的,你可以使用这样的配置flowable:exclusive=“false”。例如,以下服务任务是异步但不是唯一的。

<serviceTask id="service" flowable:expression="${myService.performBooking(hotel, dates)}"
flowable:async="true" flowable:exclusive="false" />

这是一个很好的解决方案?我们有人问这是否是一个好的解决方案。他们担心的是,这会妨碍你平行地“做事”,因此会成为一个性能问题。再次,有两件事情需要考虑:

  • 如果你是一个专家,并且知道你在做什么(并且已经理解了“为什么独占工作?”一节),它可以被关闭。除此之外,如果异步延续和定时器等工作正常,大多数用户更直观。
  • 这实际上不是一个性能问题。性能是重负载下的问题。重负载意味着作业执行程序的所有工作线程始终处于繁忙状态。通过独占工作,Flowable将简单地分配负载。独占作业意味着来自单个流程实例的作业是由相同的线程按顺序执行的。但是考虑一下:你有多个单独的流程实例。来自其他流程实例的作业被委托给其他线程并同时执行。这意味着对于独占作业,Flowable将不会同时从同一个进程实例执行作业,但它仍然会同时执行多个实例。从整体吞吐量的角度来看,这在大多数情况下是可取的,因为它通常会导致个别实例更快地完成。此外,执行相同流程实例的后续作业所需的数据已经存在于正在执行的集群节点的缓存中。如果作业不具有此节点关联性,则可能需要从数据库中再次获取该数据。

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程是《Flowable流程入门课程》的后续高级课程。在学习本课程前,应先学习入门课程,以掌握相关基础知识。高级课程着重讲解Flowable工作流的高级概念、复杂理论和实战应用。课程内容包括流程管理思想、技术与标准、工作流的控制模式和资源模式;Flowable数据库表及变量;与Spring、Spring Boot的集成;BPMN 2.0主要类图;Flowable高级服务如JAVA服务任务、脚本任务、Web Service任务、外部工作者任务、多实例任务、补偿处理程序、子流程和调用活动等;Flowable事件侦听器、执行侦听器和任务侦听器;Flowable历史和REST API;Flowable事务、并发性、身份管理及LDAP集成;Flowable高级主题如流程实例迁移、异步执行器的设计与配置、用于高并发的UUID ID生成器、多租户、高级流程引擎配置、执行自定义SQL和实验性流程调试器等;Flowable Eclipse设计器特性及定制;Flowable 事件注册;Flowable相关标准和规范如ISO8601标准和cron等。本课程对Flowable官方文档进行了彻底梳理和融汇贯通,并结合实践,形象生动、系统全面、简单易懂地呈现给大家,让大家从开源软件文档冗长耗时、英文晦涩难懂、概念理解困难、知识点分散等困境中解脱出来,从而能快速地将Flowable具有的高级特性应用到项目的高级需求和复杂实践中去。课程特色:案例和代码驱动、基础概念与经典实战相结合、知识环节融会贯通、关联知识平滑拓展、概念和原理展示形象生动。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值