API Router 的应用场景非常广泛,比如从最简单的黑白名单路径列表匹配,到 Web 框架底层的路由,再到 API Gateway 。上层应用的性能上限很大程度取决于 Router 的性能上限。
虽然一个 O(N) 复杂度的 Router 在极少数量的 Routes 下可以保持很快的匹配速度,但是随着 Routes 数量的增加,O(N) Router 的性能也开始捉襟见肘。
Lua-Radix-Router 是一个基于动态压缩树(Radix Tree)实现的轻量高性能 Router ,用纯 Lua 编写。时间复杂度是 O(log n)。即使在一百万 Routes 场景,匹配时间依然可以保持纳秒级别。
https://github.com/vm-001/lua-radix-router
变量路径:语法 {varname}。
前缀匹配:语法 {*varname}
变量绑定:路由器在匹配过程中会自动帮你注入绑定结果。
最佳性能:Lua/LuaJIT 中最快的路由器
OpenAPI 友好:完全支持 OpenAPI 。
TEST CASE | Router number | nanoseconds / op | QPS |
---|---|---|---|
static path | 100000 | 0.0120372 | 83,075,798 |
simple variable | 100000 | 0.0823292 | 12,146,358 |
simple prefix | 100000 | 0.0726753 | 13,759,833 |
complex variable | 100000 | 0.922157 | 1,084,414 |
simple variable binding | 100000 | 0.2183163 | 4,580,510 |
github | 609 | 0.384233 | 2,602,587 |
当初在写这个库的时候,仅仅只是为了解决 OpenAPI Spec 的 API 匹配,但是在做完基准测试后发现性能非常之快,比同类的一个用 FFI 调 C 模块 Radix 的路由还快 3 倍,在我使用 GitHub 开放的 609 的 APIs (模拟真实应用场景)测试的时候,发现性能比它快接近 70 倍。
希望在 2023 年的最后一个工作日能给 V2EX 的(Lua/API Gateway)朋友带来一个称手的工具,或是一些技术性的启发/灵感。我会在明年(2024)写关于底层实现技术文章,以及更多 Lua-Radix-Router 在更多场景的应用。
欢迎大家 star 保持关注. https://github.com/vm-001/lua-radix-router