@bimetal/ store-sqlite (英语)
SQL 备份 EventStore 执行情况 @bimetal/event-sourcing ——基于文件的零配置
本地事件来源。 与任意域包一起使用( E)@bimetal/calendar-data, (中文(简体) ), @bimetal/table-data, (中文(简体) ),
. . . . . . . better-sqlite3。 。 。 .
它是其中一种存储适配器 覆盖 存储均等测试套件 (内存 / SQLite ) EventStoreDB产生比特-等同的结果,所以它是内存商店的倒置替换.
安装
npm install @bimetal/store-sqlite
使用量
import { createSqliteEventStore } from '@bimetal/store-sqlite';
import { createCalendarStore } from '@bimetal/calendar-data';
const eventStore = createSqliteEventStore({ path: './events.db' });
const store = createCalendarStore({ eventStore });
await store.hydrate();
即时快照( A)createSqliteSnapshotStore(中文(简体) )
没有持续的快照店,每个进程都会从第一次事件开始重放流出
然后将整个日志保存在记忆中. createSqliteSnapshotStore 保存最新数据
自己每条流的快照 snapshots 表格 指向 同一文件 作为事件存储 :
import { createSqliteEventStore, createSqliteSnapshotStore } from '@bimetal/store-sqlite';
import { createCalendarStore } from '@bimetal/calendar-data';
const eventStore = createSqliteEventStore('./events.db');
const snapshotStore = createSqliteSnapshotStore('./events.db');
const store = createCalendarStore({ eventStore, snapshotStore, snapshotEveryN: 500 });
await store.hydrate(); // loads snapshot + the events after it — not the whole log
- 每行一行, 最后保存获胜 - 与
createInMemorySnapshotStore, (中文(简体) ), 由下列因素支撑:runSnapshotStoreConformance(单位:千美元)@bimetal/event-sourcing/conformance) (中文(简体) ). - 写成附件 :
save运行于 aBEGIN IMMEDIATE交易 - 写入锁是 在更新运行之前(从测试中的第二个连接中检查)进行. - 格式锁随行 :
eventSchemaVersion保存和返回不变;hydrate()拒绝从更新的策略中获取快照(UnknownEventSchemaVersionError) (中文(简体) ). - 其他投影版本 ~ 完整重播 :
hydrate()忽略存储的快照projectionVersion不同,并折叠整流。 坚固的一行一直呆到下一个 即刻写出(snapshotEveryN或者说rebuild()),所以在此之前,每个开始完全重放. - 打开自己的连接.
':memory:'是私人数据库,不与事件商店共享. - 聚合状态被存储为JSON(地图为条目列表). 它必须是JSON安全——它是 每当从 SQLite 中读取的事件折叠时.
测量效果
scripts/heap-messung.mjs 在一流中建立2万个日历事件的日志(2 000个条目 ×)
1 创建 + 9 更新 , 在结尾写一个快照, 然后在新的节点进程中水合物
运行( r)--expose-gc, (中文(简体) ), heapUsed 开口前和水合物后完全GC后,中位数为3.
测量了2026-10-03,节点v22.23.3:
| 水合物后堆积 | 水合物时间 | 举办的活动 | |
|---|---|---|---|
| 无快照 | 13.2 米贝 | 852分钟 | 2万个 |
| 带有快照 | 7.5 米贝 | 75分钟 | 0 个 |
日志载荷1.2米B,快照行4.3米B. 剩下的是总体状态 本身 —— 包括实体撤消堆栈, 这就是为什么快照行大于日志 载荷在这一工作量中。 保存是日志存储开始时不再加载 : 水合之后 它只保留了快照后的事件 而不是整个溪流 数字是工作量的.
这无关紧要: 只有初始时的内存被测量和限制。 运行中
处理持有的日志随着水合物之后的每一个事件不断增长——写出一个快照
通过 snapshotEveryN 不修剪(被跟踪为双金属-316). 长期进程
仍然需要重启 以卸下日志。 重运行测量 :
npm run build -w @bimetal/store-sqlite
node packages/storage/store-sqlite/scripts/heap-messung.mjs 2000 9 3
选项( E)SqliteStoreOptions(中文(简体) )
| 选项 | 目的 |
|---|---|
path | SQLite 数据库文件路径 。 使用 ':memory:' 用于内存数据库. |
wal? | 启用 WAL 模式以更好地同时读取性能 。 默认 true。 。 。 . |
测试
npm test --workspace @bimetal/store-sqlite
平等套间__tests__/storage-parity.test.ts运行相同 append编号 :read编号 :subscribe
与记忆、SQLite和事件StoreDB的序列并声称相同的结果——担保
这使得适配器可以互换.