![]()
3.0版本发布至今,SurrealDB官方博客连发了数篇新功能详解,却对一个核心组件只字未提——它叫SurrealMX,100%的3.x用户每天都在用,但几乎没人听说过这个名字。
原因很荒诞:启动命令还是surreal start,没变过。SurrealMX就是SurrealDB全新的内存存储引擎,而内存存储恰恰是3.0的默认配置。换句话说,你以为是旧东西,其实早就换芯了。
这个引擎从零开始写了一年多,去年11月悄悄合进3.0 alpha,没发公告,没写博客,就这么成了所有人的默认选项。直到三周前的一个PR,才暴露它藏了更狠的功能。
配置语法大变:从「前缀魔法」到URL参数
2.x版本的存储配置像在玩猜谜。想开SurrealKV的版本控制?得写成surrealkv+versioned://mydb。其他后端?没这待遇,各玩各的。
3.0彻底推翻这套。现在所有配置都跟在路径后面,像URL参数一样堆叠:
"surrealkv://path/to/db?versioned=true&sync=every&retention=30d"
"mem://tmp/data?versioned=true&aol=sync&snapshot=60s&sync=5s"
眼尖的人发现了:versioned=true不仅出现在surrealkv,还出现在mem——也就是SurrealMX。内存存储现在支持时间旅行查询,和持久化存储平起平坐。
这对合规场景是核弹级更新。金融、医疗、法律行业常面临一个噩梦:数据被覆盖了,审计却要查历史状态。传统方案是堆WAL日志或搞CDC管道,复杂且延迟高。SurrealMX把版本控制直接做进内存引擎,查询时加一句VERSION就能穿越回去。
时间旅行怎么用:一行SQL穿越任意时刻
![]()
SurrealDB的语法很直白。假设你有个订单表,想查昨天中午12点的状态:
SELECT * FROM orders VERSION d'2024-03-25T12:00:00Z'
不需要ETL,不需要快照表,不需要向运维申请历史库权限。内存里的数据自带时间轴,像Git的commit历史,但查询延迟是微秒级。
更狠的是,SurrealMX的版本控制可以配保留策略。retention=30d意味着30天前的版本自动清理,内存不会无限膨胀。这对长周期合规需求可能不够,但配合snapshot=60s的持久化策略,可以折中——热数据在内存里随时穿越,冷数据落盘后按SurrealKV的规则长期留存。
性能层面,SurrealDB团队没公布详细benchmark,但从架构推断:内存引擎跳过了序列化开销,版本控制用增量存储而非全量拷贝。这对高频写入场景是刚需,比如实时风控系统每秒几万笔决策,既要快又要留痕。
为什么现在才暴露?SurrealDB的产品节奏
回看时间线:2023年底合进alpha,2024年3月GA,功能藏了四个月才通过文档和PR半公开。这种「先替换,后宣传」的路数,在数据库领域不多见。
通常厂商恨不得把新引擎吹成「颠覆性突破」,SurrealDB却选择让用户无感知迁移。好处是风险低——3.0发布时没人吐槽「内存存储变慢了」,因为SurrealMX确实更快。代价是高级功能被埋没,直到有人翻源码才发现mem://后面能跟一堆参数。
三周前那个PR的作者叫Tobie Morgan Hitchcock,SurrealDB创始人。他在PR描述里只写了「add query string support for memory backend」,没提时间旅行,没提合规场景。典型的工程师思维:功能做了,文档写了,剩下的自己看。
但用户视角完全不同。一个做跨境支付的朋友告诉我,他们去年切SurrealDB 3.0后,审计查询一直走CDC到ClickHouse的链路,延迟分钟级。如果早知道内存引擎自带版本控制,架构能砍掉一半复杂度。
![]()
内存版本控制的边界:什么时候该用,什么时候快跑
SurrealMX不是银弹。它的版本数据存在内存里,意味着:
进程崩溃 = 未持久化的版本全丢。 配置了aol=sync和snapshot能缓解,但本质上是「热数据快速穿越,冷数据落盘长期保存」的分层架构。如果你的合规要求保存七年,全放内存里不现实。
另一个陷阱是查询模式。VERSION语法目前只支持时间点查询,不支持「查某个版本之间的变更集」。要做diff还得自己拉两条记录对比,不像Git的git diff那么顺手。
但反过来,有些场景它是唯一解。比如高频交易策略的回测:需要在一毫秒内反复查询同一笔订单在不同时间点的状态,传统数据库的MVCC实现扛不住这种并发。SurrealMX的内存版本控制无锁读取,天生适合。
还有个隐藏用法:测试环境造数据。开发时常需要「把数据库回滚到测试开始前的状态」,以前要搞事务包裹或容器快照。现在VERSION一句搞定,甚至能写进测试框架的setup/teardown。
SurrealDB的文档在最后补了一句:「SurrealMX的版本控制默认关闭,需要显式开启versioned=true」。这解释了为什么大部分用户没发现——默认配置就是「快但不留痕」,要时光机得自己拧开关。
一个有趣的对照:PostgreSQL的temporal tables扩展搞了十年,语法臃肿,性能一般;TimescaleDB的连续聚合专攻时序,但版本控制不是一等公民。SurrealDB把这事做进默认内存引擎,配置却藏得比Linux内核参数还深。
是产品团队的疏忽,还是故意筛选「会看源码的硬核用户」?Tobie Morgan Hitchcock没回答这个问题。但三周前的PR合并后,SurrealDB的Discord群里确实有人惊呼:「原来mem backend能这么玩?」
下一个问题是:当你的竞争对手还在用CDC管道搞合规,而你发现内存查询就能穿越时间,你会第一时间重构架构,还是先观察半年看有没有坑?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.