1 分•作者: juanloco•3 个月前
返回首页
最新
1 分•作者: r2sk5t•3 个月前
7 分•作者: lichtenberger•3 个月前
嗨 HN!我之前在 2019 年([https://news.ycombinator.com/item?id=19834681](https://news.ycombinator.com/item?id=19834681))和 2023 年([https://news.ycombinator.com/item?id=38252963](https://news.ycombinator.com/item?id=38252963))都发布过 SirixDB。
SirixDB 的核心理念是,历史是一个一等公民。每次提交都会存储一个轻量级、可查询的版本。您可以查询任何时间点,甚至单个节点(例如 JSON 值),比较任意版本之间的差异,并高效地跟踪数据如何演变,而无需重放事件。
与传统的事件存储不同,历史状态不需要通过重放事件来重建,我们也不必考虑投影。版本是直接可查询的。
一个简单的例子:
1 月 1 日:记录“价格 = 100 美元,1 月 1 日生效”。存储于 1 月 1 日(交易时间)。
1 月 20 日:发现 1 月 1 日的价格实际上是 95 美元。提交更正。
更正后,您可以跨两个维度进行查询:
- “我们认为 1 月 16 日的价格是多少?” -> 100 美元(交易时间)
- “1 月 1 日的价格是多少?” -> 95 美元(生效时间)
自 2013 年以来,我一直在业余时间从事这项工作,追随康斯坦茨大学的学术前身(Idefix/Treetank)。该架构依赖于一个仅追加的物理日志和一个持久的写时复制页三元组。
架构的概览:
物理日志(仅追加,顺序写入)
```
┌────────────────────────────────────────────────────────────────────────┐
│ [R1:Root] [R1:P1] [R1:P2] [R2:Root] [R2:P1'] [R3:Root] [R3:P2'] ... │
└────────────────────────────────────────────────────────────────────────┘
t=0 t=1 t=2 t=3 t=4 t=5 t=6 → 时间
```
每个版本都经过索引,未更改的页面是共享的:
```
[Rev 1] [Rev 2] [Rev 3]
│ │ │
▼ ▼ ▼
[Root₁] [Root₂] [Root₃]
│ │ │ │ │ │
│ └─────────┐ │ └────────┐ │ └─────────┐
▼ ▼ ▼ ▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ P1 │ │ P2 │ │ P1' │ │ P2' │
└──────┘ └──────┘ └──────┘ └──────┘
Rev 1 Rev 1+2 Rev 2+3 Rev 3
(共享) (共享)
```
根页面下方是节点和二级索引,使用一种新颖的滑动快照算法来平衡读/写性能。所有内容都可以通过 Brackit 编译器使用 JSONiq 进行查询。
早在 2019 年,甚至在 2023 年,SirixDB 都因为 GC 压力而非常慢。与大多数其他文档存储不同,SirixDB 存储细粒度的节点,我意识到由大量小对象组成的堆上(JVM)表示根本没有意义。我使用 async-profiler 进行了测量——在 Andrei Pangin 本人的帮助下——结果是吞吐量低下是由于分配量巨大,该分配量几乎与打开的事务数量成线性关系。
由于我全职从事软件工程工作,我没有精力在业余时间进行大规模的重写。大约一年前,我开始尝试使用 AI。事实证明,AI 非常适合自动化将存储层迁移到 Java 的 Foreign Function & Memory API 的繁琐、重复部分,将页面完全存储在堆外。
展望未来,仅追加、不可变的页面设计自然地映射到 S3 等对象存储和 Kafka 等分布式日志,用于云版本,并且已经存在初步的原型。也许有一天它会成为一项商业服务,但目前,我很高兴看到这些核心设计原则终于得到验证。
有一个交互式演示、文档,代码在 GitHub 上。我很乐意听取反馈并回答问题!
此致,
Johannes
[1] [https://sirix.io](https://sirix.io) | [https://github.com/sirixdb/sirix](https://github.com/sirixdb/sirix)
[2] [https://sirix.io/docs/architecture.html](https://sirix.io/docs/architecture.html)
[3] [https://demo.sirix.io](https://demo.sirix.io)
[4] [https://sirix.io/docs/](https://sirix.io/docs/)
[5] [http://brackit.io](http://brackit.io)
3 分•作者: RajX_dev•3 个月前
今天我用自己的工具扫描了整个 Django 仓库,它用了 2.5 分钟就完成了索引,并为我搜索的每个函数生成了完整的图谱。看到自己亲手构建的东西能够正常工作,总是令人无比激动。T-T
22 分•作者: neomindryan•3 个月前
11 分•作者: gnabgib•3 个月前
1 分•作者: delfrrr•3 个月前
1 分•作者: ndr42•3 个月前
1 分•作者: mankins•3 个月前
1 分•作者: robtherobber•3 个月前
1 分•作者: andrewstetsenko•3 个月前
1 分•作者: zhinit•3 个月前
1 分•作者: beerdappel•3 个月前
1 分•作者: zachyarbro•3 个月前
1 分•作者: petethomas•3 个月前
1 分•作者: ke4qqq•3 个月前
6 分•作者: sungchi•3 个月前
59 分•作者: hermanzegerman•3 个月前
2 分•作者: rajathbail•3 个月前
7 分•作者: gmays•3 个月前