前言
有段时间没写文章了,这段时间一直在看camunda服务编排的一些东西,之前没有接触过工作流引擎和服务编排类似的东西,花了一点时间来熟悉和理解。由于我们需要运用camunda来做服务编排,因此对于一个编排,其中的工作单元是分布在多个微服务内部的业务调用,如何在服务编排中保持分布式事务的支持就成了我的关注点。camunda提供了补偿机制和对应的SAGA 模式来完成分布式事务的支持。本篇文章将对这一块进行描述和探讨。
错误处理机制
对于分布式事务来说,归根结底我们要考虑的就是,微服务调用出错的时候,我们的流程应该如何流转,并在这个流转过程中保证事务的一致性。因此我们第一个考虑的就是camunda本身的错误处理机制是什么。
事务回滚
第一种错误处理方式是事务回滚,要理解这个方式我们首先要看看camunda中事务是怎么组织的。在camunda中,流程的运行是被封装在一个个客户线程(client thread)中。可以这么理解,当一个启动或者继续流程的请求到来之时,在我们的服务器的处理线程中(类似于tomcat中的http-thread-pool开头的那些线程),我们通过调用类似于下面的API
runtimeService.startProcessInstanceByKey(...)
来发起一个流程,这时候整个流程就完全运行在http-thread-pool线程中,这就称之为我们借用了一个客户线程,在这个线程中,camunda始终会开启一个数据库事务,并在这个事务下进行流程的运转。
在这个情况下,流程会一直运转到下一个等待状态(wait status 代表流程会在后面的某个时期继续),然后完成状态的持久化到数据库中,结束事务。在bpmn标准中,有下列几个等待状态:
- Tasks:
- 接受任务(receive task)
- 用户任务(user task)
- 外部服务任务(service task: external task)
- Events:
- 消息事件(message event)
- 定时事件(timer event)
- 信号事件(signal event)
- Gateway
- 基于时间的逻辑门(Event Based Gateway)
我们可以通过下