工作流引擎:其实是类似于在我们生活中处理一些事情的流程,即使在过程中不会出现更换人员的情况,只要是办理流程的转移或变化,都可以将它纳入到这个范畴!例子:当你去办理事情,首先是 A 君和你交涉,当处理完成后,又有 B 君和你洽谈,这就是一个典型的流程。每个流程都可以拆分为小的子流程, 它代表了一种数据或信息的流向;
JBPM 用全对象化的方式,模拟了这种形态。通过提供的 ProcessDefine,Take,Token,Action,Event 等持久化地对象,来推动流程在计算机里的实现;

规则引擎:首先规则是指的是办理事情的一些符合自身的条件。是万物生存的根本。规则可以促使形成工作流程,同时是支配流程的最要因素。没了规则,就没有流程;规则引擎就是通过提供的多种方式,来解释调用者设定这些规则后,需要完成的事情;

工作流是一个个节点串在一起的。 规则是这个节点中接受数据然后输出数据的一系列规则。

我来详细解释工作流(Workflow)和规则引擎(Rule Engine)的区别,并通过伪代码说明。

主要区别

1. 核心目标不同

  • 工作流:关注业务流程的编排和流转,强调”做什么”和”什么顺序做”
  • 规则引擎:关注业务决策的制定,强调”在什么条件下做什么”

2. 执行模式不同

  • 工作流:按照预定义的路径顺序执行,是线性或分支的过程
  • 规则引擎:根据事实和规则进行模式匹配,执行满足条件的规则,是非线性的

3. 应用场景不同

  • 工作流:适用于有明确步骤和审批流程的场景,如请假审批、报销流程
  • 规则引擎:适用于复杂决策逻辑的场景,如风控规则、促销规则

伪代码示例

工作流示例(请假审批流程)

# 工作流定义
class LeaveWorkflow:
    def start(self, request):
        # 按照预定义顺序执行
        if self.submitRequest(request):
            if self.directLeaderApprove():
                if request.days > 3:
                    if self.departmentLeaderApprove():
                        return self.notifyResult("已批准")
                    else:
                        return self.notifyResult("部门经理拒绝")
                else:
                    return self.notifyResult("已批准")
            else:
                return self.notifyResult("直属领导拒绝")
        else:
            return self.notifyResult("提交失败")
 
    def submitRequest(self, request):
        # 提交请假申请
        return True
 
    def directLeaderApprove(self):
        # 直属领导审批
        return True
 
    def departmentLeaderApprove(self):
        # 部门经理审批
        return True
 
    def notifyResult(self, result):
        # 通知结果
        print(result)

规则引擎示例(促销规则)

# 规则引擎定义
class PromotionRuleEngine:
    def __init__(self):
        self.rules = []
 
    def addRule(self, rule):
        self.rules.append(rule)
 
    def execute(self, order):
        # 所有满足条件的规则都会执行
        for rule in self.rules:
            if rule.match(order):
                rule.execute(order)
 
# 规则定义
class Rule:
    def match(self, order):
        pass
    
    def execute(self, order):
        pass
 
# 具体规则实现
class TotalAmountDiscountRule(Rule):
    def match(self, order):
        return order.total_amount >= 1000
 
    def execute(self, order):
        order.discount = order.total_amount * 0.1
 
class FirstOrderRule(Rule):
    def match(self, order):
        return order.is_first_order
 
    def execute(self, order):
        order.gift = "新人礼包"
 
# 使用示例
engine = PromotionRuleEngine()
engine.addRule(TotalAmountDiscountRule())
engine.addRule(FirstOrderRule())
 
# 一个订单可能同时满足多个规则
order = Order(total_amount=1500, is_first_order=True)
engine.execute(order)

关键差异说明

  1. 执行方式

    • 工作流是按照预定义的路径顺序执行,每个节点都有明确的下一个节点
    • 规则引擎是并行匹配所有规则,满足条件的规则都会执行
  2. 维护方式

    • 工作流需要修改流程定义来改变业务流程
    • 规则引擎只需要添加或修改规则,不影响其他规则
  3. 扩展性

    • 工作流的修改可能影响整个流程
    • 规则引擎可以随时添加新规则,互不影响
  4. 使用场景

    • 工作流适合固定流程的业务场景
    • 规则引擎适合复杂决策的业务场景

通过以上伪代码可以看出,工作流更注重流程的编排,而规则引擎更注重条件的判断和动作的执行。在实际应用中,有时也会将两者结合使用,以满足更复杂的业务需求。

规则引擎开源库

MOC

工作流和状态机的区别