当多数系统还在用MySQL处理结构化数据、MongoDB扛文档量、Redis扛并发时,来自英国的SurrealDB把这三类负载直接塞进了一个二进制文件。它自称为“端到端的云原生数据库”,听着玄乎,功能却落在两个关键词:多模型(multi-model)和实时协同(real-time collaboration)。这篇文章把它到底怎么做到的、用在哪儿、值不值得投产,逐一拆解开。
多模型:同一张表,既能当SQL表,又能当文档集,还能当图
把SQL的表、Mongo的文档、Neo4j的图存在同一套存储引擎里并不新鲜,Cassandra、ArangoDB都做得到。区别是SurrealDB让“一张表”既可以存关系型强schema,也可以动态塞进JSON文档,还能在边上直接跑复杂图遍历。
例子:用户表中存了嵌套地址JSON,同时声明 DEFINE INDEX name ON TABLE user保持索引,同一条查询 SELECT ->likes->product.price FROM user WHERE age > 30就把关联子图一次性扫出来,中间无任何JOIN语法。
底层实现叫 SurrealKV,用Bitcask作为LSM-tree存储层,Key-Value接口把文档切成扁平tuple,保留字段级版本号,所以才能在不锁定schema的前提下维持可更新的二级索引。
实时推送:数据库变消息队列
传统方案把写操作落表,再让CDC工具(Debezium)推到Kafka,下游服务做投影。SurrealDB把这些步骤收进了 LIVE SELECT语句: LIVE SELECT * FROM temperature WHERE location='a1';一旦 temperature表被插入或更新,WebSocket通道直接推送完整JSON给订阅客户端,延迟实测在本地环回中<1 ms。
在物联网场景下,一条温控传感器每秒写入10次,SurrealDB把变更事件当成数据库内的一等公民,客户端不需要解析binlog、拼合offset,直接拿事件对象就渲染图表,前端代码直接省掉一个Node中间层。
嵌入式与分布式同一个二进制
开发机执行 surreal start --log=trace --user=root --pass=root memory就能跑完整的ACID实例;生产环境跑 surreal start --node=3 --bind=0.0.0.0:8000 tikv://10.0.0.1:2379即可接入TiKV集群做横向扩容,两者同一个二进制文件。切换时不需要改代码,只要换启动参数,连接字符串依旧是 surreal://root:root@localhost:8000。
对中小企业来说,这意味着上线第一天用单机省成本,等订单量上来直接水平扩容,数据零迁移、客户端零改动。官方给出的基准:在8核32 GB的三节点集群上,SurrealDB跑了2.3万次QPS的混合读写,P99延迟在15 ms左右,和同等规格PostgreSQL+Redis双栈相当。
WebAssembly驱动的嵌入式边缘副本
一个容易被忽略的特性:SurrealDB可以编译到WASM,直接运行在浏览器或Cloudflare Worker里。查询引擎、事务与存储全部塞进浏览器沙箱,前端离线应用把数据存在IndexedDB,等网络恢复再和云端同步。官方Demo用300 KB的WASM包跑了一个带图查询的记事本,断网状态照样编辑内容,在线后自动冲突合并。
这一步真正做到了“端-边-云”同构。IoT设备如果运行 wasmedge,可以直接在芯片里做轻量级事务,不需要额外MQTT broker。
开发者上手只需一份SQL方言
SurrealQL保持了与SQL接近的语法: CREATE person:100 SET name='Ada Lovelace', skills=['math','code'];插入文档; RELATE person:100->loves->person:101;直接建图边; SELECT <-loves<-person.name FROM person:101;双向图查找;支持事务 BEGIN、 COMMIT;权限控制用 DEFINE TOKEN生成JWT。熟悉的工程师半小时就能写CURD,学习曲线远低于Gremlin或Cypher。
CLI附带的 surreal import可以把CSV、JSONL、SQL dump直接流式灌库,免去ETL脚本。
实际落地场景
-
- 实时聊天:用
LIVE SELECT * FROM message WHERE room=$id就能把新消息推到浏览器,省去Socket.io服务器。
- 实时聊天:用
-
- SaaS多租户:一张表搞定租户隔离,字段
DEFINE FIELD tenant ON TABLE order VALUE $session.tenant自动注入,查询和索引天然带租户前缀。
- SaaS多租户:一张表搞定租户隔离,字段
-
- 游戏存档:嵌入式副本让手机端离线继续玩,回网后增量同步云端,SurrealDB自动处理版本冲突合并。
-
- 无服务器API:Vercel上30行函数
Surreal.connect()直连线上集群,一个请求既查库存又减库存还发消息,Lambda冷启动仅180 ms。
- 无服务器API:Vercel上30行函数
局限与风险
- • 目前还没GA,最新版2.1.x仍标“beta”,官方建议不要放关键交易。
- • 事务在单机用互斥锁,集群用Percolator协议,官方承认跨分片事务延迟比TiDB略高。
- • 生态刚起步,Grafana、Prometheus exporter由社区维护,文档不算厚。
- • 部署TiKV需要额外学习成本,如果只想要开箱即用,memory或者rocksdb后端在超过500 GB数据下会出现压缩暂停观测到的秒级卡顿。
值不值得现在上车?
如果你正在做一个需要实时+离线协同 、文档嵌套 又偶尔跑复杂JOIN 的新项目,SurrealDB确实能让技术栈瘦一圈:
- • 砍Redis Pub/Sub,节省云服务账单
- • 砍ETL链路,前端直接对接数据库变更事件
- • 砍Mongo分片+Postgres报表的双写难题
但也别忘了它还没过大规模金融交易的考验。稳妥的方案是:把非关键业务模块(日志、客服聊天、用户画像)先切进去跑半年,真正看到吞吐、备份、宕机恢复曲线后,再决定是否全面替换。
GitHub开源,用 docker run --rm -p 8000:8000 surrealdb/surrealdb:latest start,你下一条CREATE语句就能验证它是否值得投入生产。
如果你对AI应用、副业搞钱、技术交流、求职招聘、软件创意感兴趣,欢迎加入架构师部落群。
如需进群请备注加群,目前群聊人数过多,广告党勿入!
