Articulo de referencia

Capitán Proto

Cap'n Proto es un formato de serialización de datos y un marco de trabajo de llamadas a procedimientos remotos (RPC) para el intercambio de datos entre programas informáticos. S...

Cap'n Proto es un formato de serialización de datos y un marco de trabajo de llamadas a procedimientos remotos (RPC) para el intercambio de datos entre programas informáticos. Su diseño de alto nivel se centra en la velocidad y la seguridad, lo que lo hace adecuado tanto para la comunicación en red como entre procesos. Cap'n Proto fue creado por Kenton Varda, antiguo responsable del mantenimiento del popular marco de trabajo Protocol Buffers de Google , y fue diseñado para evitar algunas de sus deficiencias.

Descripción general técnica

Esquema IDL

Al igual que la mayoría de los marcos RPC que se remontan a Sun RPC y OSF DCE RPC (y sus descendientes basados ​​en objetos CORBA y DCOM ), Cap'n Proto utiliza un lenguaje de descripción de interfaz (IDL) para generar bibliotecas RPC en una variedad de lenguajes de programación, automatizando muchos detalles de bajo nivel como el manejo de solicitudes de red, la conversión entre tipos de datos, etc. El esquema de interfaz de Cap'n Proto utiliza una sintaxis similar a C y admite tipos de datos primitivos comunes (booleanos, enteros, flotantes, etc.), tipos compuestos (estructuras, listas, enumeraciones), así como genéricos y tipos dinámicos . [ 2 ] Cap'n Proto también admite características orientadas a objetos como la herencia múltiple, que ha sido criticada por su complejidad. [ 3 ]

@0xa558ef006c0c123 ; # Los identificadores únicos se asignan manual o automáticamente a los archivos y tipos compuestos.struct Fecha @0x5c5a558ef006c0c1 { año @0 :Int16 ; # @n marcas los valores de orden se agregaron al esquemames @1 :UInt8 ; día @2 :UInt8 ; } struct Contact @0xf032a54bcb3667e0 { nombre @0 :Texto ; cumpleaños @2 :Fecha ; # Los campos se pueden agregar en cualquier parte de la definición, pero su numeración debe reflejar el orden en que se agregaron.teléfonos @1 :List(Número de teléfono) ; struct PhoneNumber { # Los tipos compuestos sin un ID estático no se pueden renombrar, ya que los ID automáticos se generan de forma determinista.número @0 :Texto ; tipo @1 :PhoneType = móvil ; # Valor predeterminadoenumeración TipoDeTeléfono { móvil @0 ; teléfono fijo @1 ; } } } 

Los valores en los mensajes de Cap'n Proto se representan en binario , a diferencia de la codificación de texto utilizada por formatos " legibles por humanos " como JSON o XML . Cap'n Proto intenta que el protocolo de almacenamiento/red sea apropiado como un formato en memoria, de modo que no se necesite ningún paso de traducción al leer datos en la memoria o escribir datos desde la memoria. [ nota 1 ] Por ejemplo, la representación de los números ( endianness ) se eligió para que coincidiera con la representación de las arquitecturas de CPU más populares. [ 4 ] Cuando las representaciones en memoria y del protocolo de red coinciden, Cap'n Proto puede evitar copiar y codificar datos al crear o leer un mensaje y, en su lugar, apuntar a la ubicación del valor en la memoria. Cap'n Proto también admite el acceso aleatorio a los datos, lo que significa que se puede leer cualquier campo sin tener que leer todo el mensaje. [ 5 ]

A diferencia de otros protocolos de serialización binaria como XMI , Cap'n Proto considera la validación de datos granular en el nivel RPC una característica negativa que limita la capacidad de evolución de un protocolo . Esto se basa en experiencias en Google donde simplemente cambiar un campo de obligatorio a opcional causaba fallos operativos complejos. [ 6 ] [ nota 2 ] Los esquemas de Cap'n Proto están diseñados para ser lo más flexibles posible y trasladan la validación de datos al nivel de la aplicación, permitiendo el cambio arbitrario de nombres de campos, la adición de nuevos campos y la generalización de tipos concretos. [ 7 ] Sin embargo, Cap'n Proto sí valida los límites de los punteros y verifica el tipo de valores individuales cuando se acceden por primera vez . [ 5 ]

Imponer restricciones de esquema complejas también generaría una sobrecarga significativa, [ nota 3 ] anulando los beneficios de reutilizar estructuras de datos en memoria y evitando el acceso aleatorio a los datos. [ 8 ] El protocolo Cap'n Proto es teóricamente adecuado [ 9 ] para la comunicación entre procesos (IPC) muy rápida a través de memoria compartida inmutable, pero a octubre de 2020 ninguna de las  implementaciones admite  el paso de datos a través de memoria compartida. [ 10 ] Sin embargo, Cap'n Proto todavía se considera generalmente más rápido que Protocol Buffers y bibliotecas RPC similares. [ 11 ] [ 12 ]

Redes de contactos

Cap'n Proto RPC es compatible con la red: admite tanto el manejo de desconexiones como la canalización de promesas , donde un servidor canaliza la salida de una función a otra. Esto ahorra al cliente un viaje de ida y vuelta por cada llamada sucesiva al servidor sin tener que proporcionar una API dedicada para cada posible gráfico de llamadas. Cap'n Proto puede superponerse a TLS [ 13 ] y la compatibilidad con Noise Protocol Framework está en la hoja de ruta. [ 14 ] Cap'n Proto RPC es independiente del transporte, y la implementación principal admite WebSockets, HTTP, TCP y UDP. [ 15 ]

Seguridad de la capacidad

El estándar Cap'n Proto RPC tiene un modelo de seguridad de capacidades enriquecidas basado en el protocolo CapTP utilizado por el lenguaje de programación E. [ 16 ]

A partir de octubre de 2020, la implementación de referencia solo admite el nivel 2. [ 14 ]

Comparación con otros formatos de serialización

Cap'n Proto se compara a menudo con otros formatos de serialización de copia cero, como FlatBuffers de Google y Simple Binary Encoding (SBE). [ 8 ] [ 17 ]

Adopción

Cap'n Proto se creó originalmente para Sandstorm.io, una startup que ofrecía una plataforma de alojamiento de aplicaciones web con seguridad basada en capacidades. Tras el fracaso comercial de Sandstorm.io, el equipo de desarrollo fue adquirido por Cloudflare, [ 18 ] que utiliza Cap'n Proto internamente. [ 19 ]

Notas

  1. A diferencia de Apache Arrow , los valores en memoria de Cap'n Proto no son adecuados para compartir datos mutables.
  2. La opción de marcar un campo como obligatorio se eliminó de Protocol Buffers 3 .
  3. Suponiendo que los datos ya se hayan asignado (por ejemplo, en búferes de red, leídos desde disco), el acceso se convierte en O(1) . Los pasos adicionales de serialización/deserialización (como los necesarios para inspeccionar los valores) limitarían el rendimiento a O(n).

Referencias

  1. "Versión 1.4.0" . 12 de marzo de 2026. Consultado el 2 de abril de 2026 .
  2. Varda, Kenton. "Cap'n Proto Schema Language" . Archivado del original el 17 de marzo de 2015. Consultado el 5 de septiembre de 2020 .
  3. Denhardt, Ian (junio de 2019). "Una crítica del lenguaje de esquema Cap'n Proto" . zenhack.net . Archivado del original el 26 de junio de 2019. Consultado el 10 de octubre de 2020 .
  4. Varda, Kenton. "Cap'n Proto: Introducción" . Página principal de Cap'n Proto . Archivado del original el 17 de marzo de 2015. Consultado el 9 de noviembre de 2020 .
  5. 1 2 Varda, Kenton. "Cap'n Proto: Especificación de codificación" . Cap'n Proto . Archivado del original el 17 de marzo de 2015.
  6. Varda, Kenton. "FAQ § ¿Cómo hago que un campo sea "obligatorio", como en Protocol Buffers?" . Cap'n Proto . Archivado del original el 18-03-2015 . Recuperado el 05-09-2020 .
  7. "Cap'n Proto: Lenguaje de esquema" . capnproto.org . Consultado el 10 de octubre de 2020 .
  8. 1 2 "Cap'n Proto: Cap'n Proto, FlatBuffers y SBE" . capnproto.org . Consultado el 10 de octubre de 2020 .
  9. Richardson, Corey (octubre de 2016). "Robigalia: Un sistema operativo para la era moderna" . robigalia.gitlab.io . Archivado del original el 15 de septiembre de 2018. Consultado el 10 de octubre de 2020 .
  10. Kenton, Varda (3 de mayo de 2017). "¿Por qué no se pretende que el estado en memoria esté en los objetos Cap'n Proto / Protobuf?" . Hacker News (news.ycombinator.com) . Consultado el 10 de octubre de 2020 .
  11. Naughton, Chris (24 de agosto de 2018). "Protocol Benchmarks" . Github . Archivado del original el 30 de agosto de 2018. Recuperado el 5 de septiembre de 2020 .
  12. Parimi, Dinesh (2019). "Recortes de impuestos a los centros de datos: mejora de la eficiencia de WSC mediante la aceleración del búfer de protocolo" (PDF) . Recuperado el 5 de septiembre de 2020 .{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  13. "Cap'n Proto: Hoja de ruta" . capnproto.org . Consultado el 10 de octubre de 2020 .
  14. 1 2 "Hoja de ruta" . Capitán Proto . 13 de marzo de 2021. Archivado del original el 17 de marzo de 2015.
  15. "Cap'n Proto: RPC en C++" . capnproto.org . Consultado el 10 de octubre de 2020 .
  16. "Protocolo RPC" . Cap'n Proto . Archivado del original el 18 de marzo de 2015.
  17. "¿Por qué flatbuffers en lugar de capnp?" .
  18. Varda, Kenton (13 de marzo de 2017). "El equipo de Sandstorm se une a Cloudflare" . Sandstorm.io . Archivado del original el 13 de marzo de 2017. Consultado el 5 de septiembre de 2020 .
  19. Zhi, Jiale (2013). "Introducción a lua-capnproto: mejor serialización en Lua" . Archivado del original el 6 de marzo de 2014. Consultado el 5 de septiembre de 2020 .
Obtenido de " https://en.wikipedia.org/w/index.php?title=Cap%27n_Proto&oldid=1346863855 "