作者: arcosx 百度高级研发工程师,负责机器学习平台研发
前言
UDF (User-defined function) 意为用户提供或定义的函数。在数据库领域,UDF 代表一种机制:通过添加一个函数来扩展数据库服务的功能。
WebAssembly (Wasm) 是一个可移植、体积小、加载快并且兼容 Web 的全新格式。近年来 Wasm 不仅仅在前端领域广泛应用,也开始在服务端大展身手。其在服务端提供了接近原生代码的性能,但是又不损失安全性。
笔者在参加 NebulaGraph 举办的 Nebula Hackathon 2021 中将上述两种技术词汇结合起来,为其实现了第一个生产级用户自定义函数引擎,荣获该项赛事的最佳项目奖。本文是笔者在比赛结束后的总结与回顾,旨在交流与分享 Wasm 在服务端作为拓展机制的潜能,抛砖引玉。
需求分析
User-defined function 广泛应用
当下,有非常多的主流数据库或数据处理系统都存在 UDF 实现,简要列举如下:
- 关系型数据库领域,绝大部分关系型数据库,例如 MySQL,Microsoft SQL Server 等支持并且有其标准。关系型数据库标准中,将 UDF 分为标量函数 (Scalar Function) 和表值函数 (Table Function) 两类。调用标量函数只返回一个单一的值,而表值函数则返回包含多行多列的表格。
- 非关系型数据库领域,主流 NoSQL ,例如 MongoDB、Cassandra 也支持其各具特色的 UDF,例如 MongoDB 的 UDF 将 Javascript 的函数嵌入进去,Cassandra 支持上传 jar 包作为 UDF,这些特色的嵌入方式与这些数据库的实现技术密切相关。
- 大数据计算引擎:批数据计算引擎 Spark ,流数据计算引擎 Flink 支持。这些大数据计算引擎为抽象计算模型,降低用户使用门槛,都会设计的一套符合标准 SQL 语义的开发语言,这其中也包含 UDF 函数。在 Flink 引擎中,用户可以使用 UDF 来在查询语句里调用难以用其他方式表达的频繁使用或自定义的逻辑。
- 云产品,非常多的云厂商都在发力这个方向,例如 Google BigQuery 允许用户从 SQL 查询调用以 JavaScript 编写的代码,阿里云的 MaxCompute 可以直接将 Java 或 Python 代码作为 UDF 嵌入 SQL。
- 图数据库领域,事实上的图数据库查询语句标准 openCypher 存在 UDF 的定义,各大图数据库也都支持,例如 Tiger Graph 支持强绑定 C++ 语言的查询 UDF ,Neo4j 支持外挂 Java 脚本式的 UDF。
综上,不难得出,UDF 函数作为一种有效的拓展机制已经在各个数据系统间广泛应用。
而在 Nebula Hackathon 2021 比赛过程中,考虑到 Nebula Graph 在当时的最新版本 (2.6.1) 不支持 UDF,笔者的比赛初衷即是基于 Nebula 优秀的能力底座,为 Nebula 实现超越业界现有实现的 UDF 引擎。
Wasm-based plugin 珠玉在前
Wasm 作为前端领域诞生的技术,早已在前端广泛应用,例如 Ebay 基于 Wasm 为 Web 端提供条形码扫描功能。AutoCAD Web 通过 Wasm 将其 Native 应用移植到 Web 平台。
Wasm 在服务端的应用方兴未艾,有非常多的应用尝试在服务端使用 Wasm 技术,例如