Un protocolo nativo, no pgwire
Hablar el protocolo de red de Postgres (pgwire) daría acceso inmediato a un ecosistema, y se evaluó en serio. Ganó lo nativo porque aquello que hace que valga la pena conectarse a Arkeion — engancharse a una rama, migrar, diff, merge, verify sobre la conexión — no encaja en pgwire sin forzarlo con variables de sesión y sintaxis improvisada. Una capa de compatibilidad pgwire para CRUD sencillo sigue siendo una posible incorporación posterior; lo que un servidor Arkeion vende es precisamente lo que pgwire no sabe decir.
Open-core, trazado en la línea del repositorio
La frontera del open-core se traza a nivel de repositorio, de modo que la biblioteca abierta se mantiene pura y el servidor comercial nunca tiene que tocarla.
- El motor y el protocolo se distribuyen juntos y siguen siendo abiertos. El protocolo de red está escrito a mano — sin serde — y reutiliza la propia codificación de varint y de valores del motor.
- El cliente es un SDK síncrono en Rust (
use_branch,execute,query,query_as_of,verify). Mantenerlo abierto es lo que hace adoptable el servidor. - El servidor,
arkeiond, es propietario. Funciona con un hilo por conexión y sin runtime asíncrono, lo que encaja con el motor de escritor único y mantiene pequeña la cadena de suministro. Ofrecerlo como servicio gestionado requiere la aprobación previa de Syrakon.
Una sesión es una vista sobre una rama
Una conexión TCP es una sesión, y una sesión es una vista sobre una rama (main por defecto, conmutable). El escritor único del motor serializa las escrituras de todos los clientes; las lecturas se ejecutan contra snapshots — incluidas las AS OF — en paralelo, y nunca se bloquean.
Del escritor único se derivan dos consecuencias. El techo de escritura del servidor es el techo del escritor, así que el group commit — amortizar el fdatasync de cada commit entre varios clientes — es una optimización prevista. Y como una transacción abierta retiene el bloqueo de escritura durante toda su vida, hacen falta timeouts y cancelación para que un cliente atascado no frene a los demás.
Por la red
El framing es deliberadamente aburrido: una trama con prefijo de longitud que transporta una carga útil etiquetada, limitada a 64 MiB para que una trama defectuosa no agote la memoria.
frame = [u32 LE length][payload]
payload = [u8 tag][fields...] # fields use the engine's varint + value codec
tag → message
Hello / Welcome handshake
UseBranch switch the session's branch
Execute → Affected a write; returns rows affected
Query{AS OF} → Rows a read, optionally against a past version
Verify → Audit cryptographic check; returns the chain hash
Error structured failure
Seguridad
- El cifrado en tránsito (TLS) complementa el cifrado en reposo del motor. La primera versión habla en claro sobre
localhost; TLS está en la hoja de ruta cercana. - La capa de conexión es el sitio natural para autenticación, roles y permisos por rama — por ejemplo,
mainen solo lectura para unos clientes y una rama de trabajo escribible para otros.
Estado
El protocolo, el cliente y el servidor están en su sitio: CRUD, aislamiento por ramas, AS OF, verify y diff/merge funcionan sobre un socket real. Lo siguiente en la lista son las transacciones multisentencia (con timeout de escritor), después TLS con autenticación y permisos por rama y —opcionalmente— una capa de compatibilidad pgwire para CRUD genérico.