Arquitectura d’emmagatzematge del gravador
Audience: Engineers changing persistence logic, query semantics, schema, Audiència: Enginyers que canvien la lògica de persistència, la semàntica de consultes, l’esquema o els backends d’emmagatzematge.
Taula de continguts
- Visió Executiva
- Contractes de Trait de Botiga
- Backend en memòria
- SQLite Backend
- Esquema SQLite i Indexació
- Aplicació de la Continuïtat de la Cadena
- Semàntica de Consulta i Paginació
- Corrupció i Gestió d’Errors
- File per Fitxer Referència Creuada
Executive Overview
recorder-store proporciona l’abstracció de persistència i dos backends concrets:
InMemoryStoreper a proves deterministes i execució local,SqliteStoreper a l’operació durable amb WAL i comprovacions transaccionals.
Ambdós implementen contractes de trait compartits per a operacions d’envelop, adjunt i segment. F:crates/recorder-store/src/lib.rs L11-L37 F:crates/recorder-store/src/lib.rs L49-L71
Contractes de Trait de Botiga
El contracte d’emmagatzematge s’expressa com tres característiques asíncrones:
EnvelopeStore: afegir/obtenir/consultar/cadenar-cap/segmentar-envelopes,AttachmentStore: posar/obtenir/existir per blobs adreçats al contingut,SegmentStore: crear/sellar/llistar/obtenir metadades i gènesi.
Els invariants bàsics inclouen un comportament d’append-only, comprovacions de continuïtat de la cadena i immutabilitat de segments segellats. La creació de segments és fail-closed: les botigues rebutgen un nou segment quan ja existeix un altre segment obert o quan ja existeix l’ID del segment. F:crates/recorder-store/src/traits.rs L43-L101 F:crates/recorder-store/src/traits.rs L107-L138 F:crates/recorder-store/src/traits.rs L144-L206
Nuances actuals de la ingestió de sidecar:
- sidecar mutating ingest uses writer-owned SQLite transaction logic over
streams+segmentsstream identity columns to maintain one open segment per clau de flux, - this stream-scoped segment lifecycle is intentionally decoupled from legacy trait-level single-active-segment assumptions used by recorder-era APIs. F:crates/recorder-store/src/traits.rs L43-L101 F:crates/recorder-sidecar/src/ingest.rs
Backend en memòria
InMemoryStore utilitza mapes i vectors protegits per bloqueig, preservant les comprovacions d’invariants però sense garanties de consistència en cas de fallada. F:crates/recorder-store/src/memory.rs L12-L16
Aspectes destacats del comportament:
- valida l’estat del segment i la continuïtat de la cadena en afegir,
- manté les ID d’envelopes de primer/últim i les actualitzacions del cap de cadena,
- aplica regles de creació de segment únic obert i sense ID de segment duplicat,
- suporta la llista de segments determinista per
created_at, - aplica un ordre de consulta d’envelopes determinista per
segment_idi després per seqüència.
F:crates/recorder-store/src/memory.rs L124-L180 F:crates/recorder-store/src/memory.rs L317-L407
SQLite Backend
SqliteStore dirigeix totes les operacions de la base de dades a través d’un fil de connexió dedicat (SqliteConnection) per preservar de manera segura la semàntica de l’escriptor únic entre els cridadors asíncrons. F:crates/recorder-store/src/sqlite/mod.rs L12-L22 F:crates/recorder-store/src/sqlite/connection.rs L12-L21
SqliteConnection::execute utilitza sync_channel limitat + canals oneshot per connectar codi asíncron amb operacions síncrones de rusqlite. L’admissió a la cua és explícita: l’ saturació de la cua falla tancada amb StoreError::ConcurrencyConflict en lloc de permetre un creixement il·limitat de treball en memòria. F:crates/recorder-store/src/sqlite/connection.rs L42-L136 F:crates/recorder-store/src/sqlite/connection.rs L167-L222
La descoberta de segments actius (get_active_segment) ara falla de manera segura quan l’estat persistit està corromput per contenir múltiples segments oberts. Això impedeix un comportament de recuperació ambigu que selecciona un segment obert arbitrari. F:crates/recorder-store/src/sqlite/segment_ops.rs
SqliteStore a més exposa helpers de metadades tipades sobre store_meta (get_meta, set_meta, set_meta_batch) per a un estat d’execució determinista com ara marcadors d’idempotència per a la rotació de claus de signatura. F:crates/recorder-store/src/sqlite/mod.rs
SQLite open tuning ara suporta controls de temps d’execució explícits i validats:
- mode de durabilitat sincrònia (
FULLper defecte), - Pàgines de autocheckpoint WAL (per defecte explícit),
- optional busy-timeout. F:crates/recorder-store/src/sqlite/mod.rs F:crates/recorder-store/src/sqlite/schema.rs F:crates/recorder-store/src/sqlite/mod.rs
Esquema SQLite i Indexació
La inicialització permet:
- mode WAL,
- claus foranes,
- taula de metadades d’esquema amb porta d’esquema tancada (
schema_version=2), - segments, envoltants, fitxers adjunts i taules de connexió normalitzades,
- writer/projection tables:
streams,idempotency_entries,query_projection_envelopes, - stream identity columns on
segmentsandenvelopesused by sidecar escriptura-runtime per-stream ordenació i invariants de rotllana, - índexs per a patrons d’envolupament/segmentació/projecció de consulta deterministes.
F:crates/recorder-store/src/sqlite/schema.rs L111-L144 F:crates/recorder-store/src/sqlite/schema.rs L43-L105
Aplicació de la Continuïtat de la Cadena
Ambdós backends imposen la validació de la cadena en temps d’append mitjançant la recomputació de l’encapçalament de cadena esperat i la comparació en temps constant.
Validació d’append en memòria: F:crates/recorder-store/src/memory.rs L140-L158
La validació d’apèndix de SQLite és limitada a la transacció:
- verificar que el segment existeix i està obert,
- recalcular el hash esperat de la cadena,
- rebutjar desajustaments,
- inserir files d’envelopes + files d’adjunt d’envelopes,
- actualitzar la metadada del segment de manera atòmica.
F:crates/recorder-store/src/sqlite/envelope_ops.rs L42-L141
Semàntica de Consulta i Paginació
Les consultes d’envelopes admeten filtratge de múltiples camps, així com continuació de cursor i límit. Les consultes d’àrea de flux de sidecar utilitzen query_projection_envelopes i ORDER BY stream_sequence ASC dins de l’àmbit (tenant_id, recorder_id). Les consultes d’envelopes de segment continuen ordenant per sequence ASC.
F:crates/recorder-store/src/sqlite/envelope_ops.rs L167-L280 F:crates/recorder-store/src/sqlite/envelope_ops.rs L306-L347
La llista de segments admet filtres d’estat/temps/id i ordena per created_at ASC, segment_id ASC per preservar l’ordenació determinista sota marques de temps iguals a través de les diferents plataformes. F:crates/recorder-store/src/sqlite/segment_ops.rs L148-L245
Corrupció i Gestió d’Errors
StoreError diferencia explícitament les ruptures d’integritat, els casos no trobats, els conflictes de concurrència, les fallades del backend i la detecció de corrupció. F:crates/recorder-store/src/error.rs L36-L103
El processament de segments de SQLite tracta els valors de DB no vàlids com a corrupció (uuid no vàlid, estat desconegut, algoritme de hash desconegut, segells de temps no vàlids). F:crates/recorder-store/src/sqlite/segment_ops.rs L336-L416
Les proves del sistema ara validen el comportament de fallada tancada quan les files de SQLite persistents són manipulades amb dades de UUID/genesis de segment no vàlides entre les operacions de CLI. F:system-tests/tests/suites/persistence.rs L375-L468
File per Fitxer Referència Creuada
| Àrea | Fitxer | Notes |
|---|---|---|
| Contractes d’emmagatzematge | crates/recorder-store/src/traits.rs | Invariants del trait d’emmagatzematge canònic. |
| Tipus de segments | crates/recorder-store/src/types.rs | Metadades del segment i formes de filtre. |
| Backend en memòria | crates/recorder-store/src/memory.rs | Implementació basada en mapes determinista. |
| Façana SQLite | crates/recorder-store/src/sqlite/mod.rs | Construcció de l’emmagatzematge i composició del backend. |
| Helpers de metadades SQLite | crates/recorder-store/src/sqlite/mod.rs | Helpers de lectura/escriptura store_meta per a la persistència de l’estat en temps d’execució. |
| Pont SQLite | crates/recorder-store/src/sqlite/connection.rs | Pont async dedicat a fils. |
| Esquema SQLite | crates/recorder-store/src/sqlite/schema.rs | DDL, índexs, versionat d’esquemes. |
| Operacions SQL d’envolupament | crates/recorder-store/src/sqlite/envelope_ops.rs | Lògica de consulta de filtre i append transaccionals. |
| Operacions SQL de segment | crates/recorder-store/src/sqlite/segment_ops.rs | Cicle de vida del segment i decodificació de metadades. |
| Operacions SQL d’adjunt | crates/recorder-store/src/sqlite/attachment_ops.rs | Semàntica de put/get/exists adreçada al contingut. |
| Taxonomia d’errors | crates/recorder-store/src/error.rs | Model de fallada d’emmagatzematge tipificat. |