欢迎光临
我们一直在努力

一文总结引擎:表达式引擎、流程引擎、模板引擎、存储引擎、搜索引擎、解析引擎、计算引擎、规则引擎

概述

工作10年多,听过无数个关于引擎的概念:流程引擎、工作流引擎、规则引擎、解析引擎、搜索引擎、计算引擎…本文尝试对之前掌握或了解的知识体系进行系统性梳理,偏向于Java生态。

引擎一词在不同领域有不同的含义,但核心思想是相通的:将某种反复出现的复杂逻辑抽象封装,对外提供统一、高效的调用接口,让使用者无需关心内部实现细节。在软件开发中,引擎的引入大幅降低重复劳动,提高系统的可维护性和可扩展性。

规则引擎和流程引擎是两种不同的引擎,主要区别在于解决的问题领域不同。规则引擎主要用于处理业务规则,而流程引擎主要用于处理业务流程。简单来说,规则引擎回答"该做什么"(决策),流程引擎回答"下一步做什么"(流转)。

表达式引擎

也叫语言引擎,用于在运行时动态解析和执行表达式。这里面有一个很大的分支就是正则表达式引擎。

参考表达式引擎Aviator实战。

MVEL

MVFLEX Expression Language缩写,纯Java实现、开源(GitHub,1.2K Star,318 Fork)强大的表达式语言,官方文档。一种混合动态/静态类型的、可嵌入JVM平台的表达式语言和运行时,最早版本发布于2007年。

基于Java语法但具有更高的灵活性和动态特性,允许开发者编写表达式并由MVEL引擎进行解析和计算,从而获取表达式的计算值。动态特性意味着在源代码中不需要类型限定,这使得它在处理动态数据时非常有用。

MVEL支持多种类型的表达式,包括简单属性表达式、布尔表达式、复合语句表达式等。例如,一个简单的属性表达式如user.name可以用来获取一个变量或上下文对象的属性。布尔表达式如user.name == 'John Doe'用于执行条件判断。复合语句表达式允许编写包含多个语句的脚本,使用分号分隔。

提供一系列操作符,包括一元操作符、比较运算符、逻辑运算符、按位运算符和数学运算符。这些操作符允许执行各种操作,如实例化对象、执行多个操作、断言值的正确性、判断变量是否定义等。还支持集合、列表和数组的操作,允许以简洁的语法描述这些数据结构。

允许开发者定义自己的方法和函数,这些方法可以在表达式中使用。通过将自定义方法添加到MVEL的ParserContext中,可以在表达式中调用这些方法。例如可创建一个自定义方法来判断字符串是否包含另一个字符串,忽略大小写。

经历两个主要版本线:

  • MVEL 2.x:解释执行模式,最新稳定版为2.5.2.Final。引入动态JIT优化器、改进的错误报告,以及闭包和lambda定义等脚本语言特性;
  • MVEL 3.x:完全重写版本,将表达式转译为Java源代码,通过javac编译为字节码再执行,性能大幅提升。2026年2月发布Alpha版本。

当前GitHub仓库主分支是MVEL3版本。使用MVEL3,需依赖于JavaParser-MVEL:

git clone https://github.com/mvel/javaparsermvel.git
cd javaparsermvel
mvn clean install

然后再构建MVEL3:

git clone https://github.com/mvel/mvel.git
cd mvel
mvn clean install

MVEL在Java生态中被广泛使用,尤其是Drools规则引擎内部集成MVEL作为表达式语言。相比OGNL、JEXL、JUEL等同类表达式语言,MVEL在性能、功能和易用性方面更为突出。

其他表达式引擎:

  • OGNL(Object-Graph Navigation Language):Struts2框架默认使用
  • Spring EL(SpEL):Spring生态核心表达式语言,在Spring的各种注解和配置中广泛使用
  • JUEL:Java统一表达式语言的标准实现
  • JEXL:Apache Commons下的表达式语言引擎

流程引擎

也叫工作流引擎,是一种自动化管理和控制业务流程的软件系统,主要目的是管理和执行一系列固定的任务步骤。通常以图形化的方式展示流程,并支持自动化任务分配、任务执行、任务监控等功能。工作流引擎常用于支持大型业务流程,如审批流程、人力资源管理等。

流程引擎是一种用于自动化管理和控制业务流程的软件系统,可以将业务流程进行抽象化描述,然后实现为可执行的流程代码,从而实现对业务流程的自动化管理和控制。主要用于处理业务流程,如根据特定规则和条件自动化调度、分配和处理任务,常用于审批流程、订单处理、报销流程等场景。

参考之前写的:

  • 工作流引擎框架(一):jBPM、Activiti、Flowable、CompileFlow
  • 工作流引擎框架(二):Kestra、Prefect、Temporal、Camunda

模板引擎

模板引擎和开发语言强绑定,其核心思想是:将数据和模板分离,模板定义呈现结构和格式,数据由业务逻辑层提供,两者合并后输出最终结果(通常是HTML、XML、文本等)。

由于我最主要使用Java语言,下面汇总的多数JVM生态。

其他语言:

  • Python生态模版引擎:Django、Jinja2、Liquid、Mustache、Mako、Chameleon
  • Template.js:一款JavaScript模板引擎,用来渲染页面,使用比较简单。

JVM生态包括:

  • JSP:Java Server Pages,Java EE体系的标准视图技术。本质上是Servlet的简化写法,在HTML中嵌入Java代码(<% %>)和JSP标签。已在现代项目中逐步被淘汰。
  • Velocity:Apache Velocity,老牌模板引擎,使用#set、$variable等语法。曾广泛用于代码生成、XML转换等场景,但已进入维护阶段。
  • FreeMarker:Apache FreeMarker,功能强大的模板引擎,模板语言简洁、灵活,支持宏、函数、命名空间等高级特性。在Spring MVC中可配置为视图解析器,与Spring Boot集成良好。适合生成HTML、邮件模板、代码生成等场景。
  • Thymeleaf:现代Java Web应用的首选模板引擎,被Spring Boot官方推荐。支持自然模板(Natural Templating),即模板文件可以直接在浏览器中预览,无需在服务器端运行。语法基于HTML属性(如th:text、th:each),学习曲线平缓,同时支持国际化、布局框架等功能。
  • Groovy模板引擎:Groovy严格来说是一种基于JVM的面向对象、动态脚本语言,但其内置多种模板引擎功能:
    • SimpleTemplateEngine:基于$占位符的简单字符串模板
    • StreamingTemplateEngine:可处理大于64KB的大模板,使用可写的闭包创建模板
    • XmlTemplateEngine:基于XML模板方案,源和输出都是XML
  • Mustache:无逻辑(Logic-less)模板引擎,追求极简主义,使用{{variable}}语法。特点是不含任何控制流语句,强制将逻辑与呈现分离。有Java、JavaScript、Python、Ruby等多种语言实现。
  • Pebble:http://www.mitchellbosecke.com/pebble
  • Rocker:https://github.com/fizzed/rocker
  • Trimou:http://trimou.org
  • Jinja2:Python生态最流行的模板引擎,Django和Flask框架都使用或借鉴其设计。支持模板继承、过滤器、宏、控制结构等。语法类似Django模板但更灵活。

Groovy

Groovy,严格来说是一种基于JVM的面向对象、动态、脚本语言,拥有类似Python、Ruby和Smalltalk中的一些特性。

简单字符串模板。如下代码,先定义一个变量,然后使用${}引用变量替换模板:

def name = "Groovy"
println "This Tutorial is about ${name}"

SimpleTemplateEngine功能更强一些。直接看代码实例:

def text = 'This Tutorial focuses on $TutorialName. In this tutorial you will learn about $Topic'
def binding = ["TutorialName":"Groovy", "Topic":"Templates"]
def engine = new groovy.text.SimpleTemplateEngine()
def template = engine.createTemplate(text).make(binding)
println template

StreamingTemplateEngine引擎是Groovy提供的另一个模板引擎,类似于SimpleTemplateEngine,使用可写的闭包创建模板,使其对于大模板更具可扩展性,可处理大于64k的字符串。直接看代码实例:

def text = '''This Tutorial is <% out.print TutorialName %> The Topic name is ${TopicName}'''
def template = new groovy.text.StreamingTemplateEngine().createTemplate(text)
def binding = [TutorialName : "Groovy", TopicName : "Templates",]
String response = template.make(binding)
println(response)

XmlTemplateEngine用于模板方案,模板源和预期输出都是XML。模板使用正常的$ {expression}和$variable表示法将任意表达式插入到模板中。直接看代码实例:

def binding = [StudentName: 'Joe', id: 1, subject: 'Physics']
def engine = new groovy.text.XmlTemplateEngine()
def text = '''
<document xmlns:gsp='http://groovy.codehaus.org/2005/gsp'>
<Student>
<name>${StudentName}</name>
<ID>${id}</ID>
<subject>${subject}</subject>
</Student>
</document>
'''

def template = engine.createTemplate(text).make(binding)
println template.toString()

对比

开源(GitHub,162 Star,84 Fork)项目,使用JMH基准测试工具对JVM生态下的各种模板引擎,进行性能对比基准测试。

搜索引擎

鼎鼎大名的:Lucene、Solr、Elasticsearch。

Lucene是底层引擎库(发动机),Solr和Elasticsearch是基于Lucene的完整搜索服务(整车)。Elasticsearch在分布式能力、易用性和生态丰富度上更胜一筹,已经成为日志分析、应用搜索、可观测性领域的标准选择。

参考之前写的:

  • 搜索引擎:Meilisearch、Cellulite、LMDB、Tantivy、Quickwit
  • 搜索聚合引擎:SearXNG、Degoog

存储引擎

也是和数据库强关联,不同数据库有不同的存储引擎。不过,按照个人粗浅理解,数据库技术经过50多年的发展,不同数据库之前有很多通用的技术原理。

以MySQL 8.2.0为例,在命令行或客户端工具执行查询:

show engines;

输出如下:

EngineSupportCommentTransactionsXASavepoints
ndbcluster NO Clustered, fault-tolerant tables
CSV YES CSV storage engine NO NO NO
ARCHIVE YES Archive storage engine NO NO NO
BLACKHOLE YES /dev/null storage engine (anything you write to it disappears) NO NO NO
ndbinfo NO MySQL Cluster system information storage engine
MRG_MYISAM YES Collection of identical MyISAM tables NO NO NO
FEDERATED NO Federated MySQL storage engine
MyISAM YES MyISAM storage engine NO NO NO
PERFORMANCE_SCHEMA YES Performance Schema NO NO NO
InnoDB DEFAULT “Supports transactions, row-level locking, and foreign keys” YES YES YES
MEMORY YES “Hash based, stored in memory, useful for temporary tables” NO NO NO

InnoDB引擎核心特性:

  • 事务支持:ACID事务,隔离级别可配置(READ UNCOMMITTED至SERIALIZABLE)
  • 行级锁:相比MyISAM的表级锁,并发性能大幅提升
  • MVCC(多版本并发控制):通过Undo Log实现一致性非锁定读
  • 聚簇索引:数据按主键顺序存储,非主键索引指向主键,回表查询
  • Buffer Pool:内存缓存页,减少磁盘I/O
  • Redo Log(重做日志):保证事务持久性
  • Undo Log(撤销日志):支持事务回滚和MVCC

MongoDB存储引擎有:WiredTiger(默认,支持文档级锁和压缩),MMAPv1(已弃用)和In-Memory(纯内存)。参考MongoDB系列之WiredTiger引擎。

其他著名存储引擎:

  • RocksDB:Facebook开源的嵌入式键值存储引擎,基于LSM-Tree,广泛应用于流处理、时序数据库
  • LevelDB:Google开源的键值存储引擎
  • TokuDB:支持分形树索引,适合高写入压缩场景

解析引擎

针对待解析的对象不同,有不同的解析引擎。

  • SQL解析引擎:大数据领域最常见的解析引擎类型。将SQL语句解析成抽象语法树(AST),然后进行优化和执行。代表实现包括Apache Calcite(SQL优化器框架)、Hive SQL解析器、Presto/Trino解析器等。
  • JSON解析引擎:用于解析JSON字符串,将其转换为内存中的数据结构。Java生态中包括Jackson、Gson、Fastjson等。核心流程包括Lexer(词法分析,将JSON字符串拆分为Token流)和Parser(语法分析,根据Token流构建AST或直接映射为Java对象)。
  • XML解析引擎:包括DOM解析器(一次性加载整个文档,构建树形结构)、SAX解析器(事件驱动,流式解析,适合大文件)、StAX解析器(游标式,混合了DOM和SAX的优点)。
  • JSP解析引擎:以Tomcat的Jasper引擎为代表,将JSP文件解析成Java源文件,然后编译成class类文件,最终执行并输出HTML。
  • JS解析引擎:JavaScript运行时环境的核心组件,负责解析和执行JavaScript代码。包括V8(Chrome/Node.js)、SpiderMonkey(Firefox)、JavaScriptCore(Safari)、GraalVM(Oracle的Java/JS多语言运行时)。
  • HTML解析引擎:将HTML文档解析为DOM树。浏览器中的HTML解析器(如Blink的HTML解析器、Gecko的解析器)负责将HTML转换为渲染引擎可以处理的DOM树。

计算引擎

大数据计算引擎的发展大致经历三代:Hadoop MapReduce(第一代)→ Spark(第二代)→ Flink(第三代)。

  • MapReduce:Hadoop的分布式计算模型,将计算分为Map和Reduce两个阶段。中间结果必须写入磁盘,延迟较高(分钟到小时级),适合离线批处理。
  • Tez:Apache Tez,Hive的默认计算引擎之一。通过将MapReduce的固定两阶段模型改进为DAG(有向无环图)模型,允许更灵活的算子组合,减少不必要的中间写入。
  • Storm:Twitter开源的实时计算引擎,提供毫秒级的流处理能力。使用"Topology"(拓扑)描述计算逻辑,支持Exactly-Once语义。在实时监控、风控等场景广泛应用。
  • Spark:基于内存计算的分布式计算引擎,核心抽象是RDD(弹性分布式数据集)。通过DAG调度引擎和内存缓存,在迭代计算和交互式查询方面性能远超MapReduce。Spark Streaming采用微批(Micro-Batch)处理方式,延迟在秒级。生态丰富,包括Spark SQL、MLlib、GraphX等组件。
  • Flink:真正的流式处理引擎,以"流批一体"为核心理念,认为批处理是有限流的特例。支持事件时间(Event Time)处理、精确一次(Exactly-Once)语义、状态管理、水印(Watermark)机制。延迟低至毫秒级,适合实时风控、实时数仓、复杂事件处理等场景。

四大引擎关键对比:​

维度MapReduceSparkFlinkStorm
处理模型 纯批处理 批处理+微批流 流批一体 实时流处理
延迟 分钟级 秒级 毫秒级 毫秒级
状态管理 有限(RDD血缘) 内置大状态 有限
容错 任务重试 RDD血统恢复 分布式快照 ACK机制
适用场景 离线ETL 迭代计算、交互分析 实时数仓、CEP 实时监控

规则引擎

规则引擎是一种用于实现业务规则的软件系统,其主要目的是根据一系列预定义的规则决策系统的行为。它可以以高效的方式处理大量的业务规则,并且支持高效的决策执行。规则引擎常用于实现高效的决策支持,如风险评估、信用评级等。

规则引擎是一种用于处理规则逻辑的软件系统,可以将业务规则进行抽象化描述,然后实现为可执行的规则代码,从而实现对规则逻辑的自动化处理。规则引擎主要用于处理业务规则,例如根据特定条件触发特定的操作或者决策,常用于风险评估、交易审核、保险理赔等场景。

核心架构:规则引擎通常包含五大核心模块——规则管理中心(新增、修改、版本管理、灰度发布)、规则解析器(编译解析规则,构建规则网络)、规则执行引擎(核心模块,负责事实对象与规则的模式匹配)、事实处理模块(处理输入数据)、结果输出模块(处理规则执行结果)。

  • Drools:业界标杆规则引擎,支持Rete/Phreak算法,社区活跃,文档完善,支持动态规则热更新。功能最全面,但学习成本较高,适合企业级复杂规则场景,如金融风控、合规系统。
  • URule:国产商业开源规则引擎,提供全可视化规则配置界面,支持决策表、决策树、评分卡等多种规则类型,中文支持完善。适合国内政企项目,需要可视化规则配置、无代码开发的场景。
  • Easy Rules:轻量级极简规则引擎,API简单易懂,学习成本极低,零依赖,支持注解和编程式两种方式。适合简单规则场景、小型项目。
  • LiteFlow:国内开源框架,组件化规则编排,支持多种脚本语言,可视化界面完善,中文文档齐全。核心偏向流程编排,适合国内企业级项目中规则编排、流程驱动的业务场景。

参考之前写的:

  • 规则引擎Drools实战
  • 规则引擎LiteFlow:介绍与实战

游戏引擎

几乎不了解,应该不是用Java来实现,也列举一下吧。

游戏引擎是为游戏开发提供底层技术支持的框架,包括渲染、物理模拟、音频、动画、网络、AI等多种子系统。它让开发者无需从零实现图形学算法、物理引擎等复杂底层技术,从而专注于游戏玩法和内容创作。

  • Unity:全球使用最广的游戏引擎,以其组件化(Component)设计思想闻名,C#语言生态成熟,Asset Store拥有海量插件和资源。支持2D/3D游戏,在移动端和手游领域表现尤为出色。
  • Unreal Engine(虚幻引擎):Epic Games开发的顶级游戏引擎,C++语言,以电影级画质著称。采用蓝图(Blueprint)可视化脚本系统降低编程门槛。适合追求极致画质的3A大作、开放世界游戏。
  • Godot:开源免费的游戏引擎,独特的场景(Scene)与节点(Node)树结构,设计优雅直观。内置脚本语言GDScript,语法类似Python,易于上手。4.0版本后引入Vulkan后端,渲染能力大幅提升。适合中小型独立游戏和风格化作品。
  • Cocos Creator:专注2D和轻量级3D游戏开发,在WebGL和小游戏平台优化出色,在H5游戏和小游戏领域占据主导地位。

参考

赞(0)
未经允许不得转载:171主机测评 » 一文总结引擎:表达式引擎、流程引擎、模板引擎、存储引擎、搜索引擎、解析引擎、计算引擎、规则引擎
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址