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.

Arkeion motor embebido + protocolo de cable MIT / Apache-2.0 cliente SDK / driver de Rust MIT / Apache-2.0 la línea de lo abierto arkeiond el demonio servidor propietario
El motor, el protocolo y el cliente son abiertos para que adoptarlo no cueste; el servidor es donde vive el cloud comercial.
  • 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.

sesión · main sesión · feat-x sesión · main escritor único serializa las escrituras un fichero las lecturas (snapshots, AS OF) van en paralelo — nunca se bloquean
Cada sesión ve su propia rama; las escrituras pasan en cola por un único escritor y las lecturas nunca esperan.

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
longitud u32 LE ≤ 64 MiB carga útil etiqueta u8 campos — varint + códec de valor lee la longitud y luego exactamente esos bytes
Primero la longitud, luego una carga útil etiquetada: suficiente para enmarcar cualquier mensaje sin una biblioteca de esquemas.

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, main en 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.