stringtranslate.com

Капитан Прото

Cap'n Proto — это формат сериализации данных и фреймворк удаленного вызова процедур (RPC) для обмена данными между компьютерными программами. Высокоуровневый дизайн фокусируется на скорости и безопасности, что делает его пригодным как для сетевого, так и для межпроцессного взаимодействия. Cap'n Proto был создан бывшим разработчиком популярного фреймворка Protocol Buffers от Google (Кентон Варда) и был разработан, чтобы избежать некоторых из его предполагаемых недостатков.

Технический обзор

Схема IDL

Как и большинство фреймворков RPC , начиная с Sun RPC и OSF DCE RPC (и их объектно-ориентированных потомков CORBA и DCOM ), Cap'n Proto использует язык описания интерфейса (IDL) для генерации библиотек RPC на различных языках программирования, автоматизируя множество низкоуровневых деталей, таких как обработка сетевых запросов, преобразование между типами данных и т. д. Схема интерфейса Cap'n Proto использует синтаксис, подобный C , и поддерживает общие примитивные типы данных (логические значения, целые числа, числа с плавающей точкой и т. д.), составные типы (структуры, списки, перечисления), а также универсальные и динамические типы . [2] Cap'n Proto также поддерживает объектно-ориентированные функции, такие как множественное наследование, которое подвергалось критике за свою сложность. [3]

@0xa558ef006c0c123 ; # Уникальные идентификаторы вручную или автоматически назначаются файлам и составным типам struct Date @0x5c5a558ef006c0c1 { year @0 :Int16 ; # @n отмечает порядок, в котором значения были добавлены в схему month @1 :UInt8 ; day @2 :UInt8 ;             }struct Contact @0xf032a54bcb3667e0 { name @0 :Text ; birthday @2 :Date ; # поля могут быть добавлены в любом месте определения, но их нумерация должна отражать порядок, в котором они были добавлены           телефоны @1 :Список(НомерТелефона) ;   struct PhoneNumber { # Составные типы без статического идентификатора не могут быть переименованы, поскольку автоматические идентификаторы генерируются детерминированно number @0 :Text ; type @1 :PhoneType = mobile ; # Значение по умолчанию           enum PhoneType { мобильный @0 ; стационарный @1 ; } }        }

Значения в сообщениях Cap'n Proto представлены в двоичном формате , в отличие от текстовой кодировки, используемой в « человечески понятных » форматах, таких как JSON или XML . Cap'n Proto пытается сделать протокол хранения/сети подходящим для формата в памяти, чтобы не требовалось никакого шага преобразования при чтении данных в память или записи данных из памяти. [примечание 1] Например, представление чисел ( endianness ) было выбрано для соответствия представлению наиболее популярных архитектур ЦП. [4] Когда представления в памяти и протоколе связи совпадают, Cap'n Proto может избежать копирования и кодирования данных при создании или чтении сообщения и вместо этого указать на местоположение значения в памяти. Cap'n Proto также поддерживает произвольный доступ к данным, что означает, что любое поле может быть прочитано без необходимости читать все сообщение. [5]

В отличие от других протоколов двоичной сериализации, таких как XMI , Cap'n Proto считает детальную проверку данных на уровне RPC антифункцией, которая ограничивает возможности протокола к развитию . Это было подтверждено опытом Google, где простое изменение поля с обязательного на необязательное приводило к сложным эксплуатационным сбоям. [6] [примечание 2] Схемы Cap'n Proto разработаны так, чтобы быть максимально гибкими, и переносят проверку данных на уровень приложения, позволяя произвольно переименовывать поля, добавлять новые поля и делать конкретные типы универсальными. [7] Однако Cap'n Proto проверяет границы указателей и проверяет типы отдельных значений при первом доступе . [5]

Обеспечение сложных ограничений схемы также повлечет за собой значительные накладные расходы, [примечание 3] сводя на нет преимущества повторного использования структур данных в памяти и предотвращая случайный доступ к данным. [8] Протокол Cap'n Proto теоретически подходит [9] для очень быстрого межпроцессного взаимодействия (IPC) через неизменяемую общую память, но по состоянию на октябрь 2020 года ни одна из реализаций не поддерживает передачу данных через общую память. [10] Однако Cap'n Proto по-прежнему обычно считается более быстрым, чем Protocol Buffers и аналогичные библиотеки RPC. [11] [12]

Нетворкинг

Cap'n Proto RPC поддерживает сеть: поддерживает как обработку отключений, так и конвейеризацию обещаний , когда сервер передает вывод одной функции в другую. Это экономит клиенту циклический проход на каждый последующий вызов сервера без необходимости предоставления выделенного API для каждого возможного графика вызовов. Cap'n Proto может быть размещен поверх TLS [13] , а поддержка Noise Protocol Framework находится в планах. [14] Cap'n Proto RPC не зависит от транспорта, а основная реализация поддерживает WebSockets, HTTP, TCP и UDP. [15]

Безопасность возможностей

Стандарт Cap'n Proto RPC имеет богатую модель безопасности, основанную на протоколе CapTP, используемом языком программирования E. [16]

По состоянию на октябрь 2020 года эталонная реализация поддерживает только уровень 2. [14]

Сравнение с другими форматами сериализации

Cap'n Proto часто сравнивают с другими форматами сериализации с нулевым копированием, такими как FlatBuffers и Simple Binary Encoding (SBE) от Google. [8] [17]

Принятие

Cap'n Proto изначально был создан для Sandstorm.io, стартапа, предлагающего платформу хостинга веб-приложений с безопасностью на основе возможностей. После того, как Sandstorm.io потерпел неудачу в коммерческом плане, команда разработчиков была приобретена Cloudflare, [18] которая использует Cap'n Proto внутри компании. [19]

Примечания

  1. ^ В отличие от Apache Arrow , значения в памяти Cap'n Proto не подходят для совместного использования изменяемых данных.
  2. ^ Отметка поля как обязательного была удалена из Protocol Buffers 3.
  3. ^ Предполагая, что данные уже были выделены (например, в сетевых буферах, считаны с диска), доступ становится O(1) . Дополнительные шаги сериализации/десериализации (требуемые для проверки значений) ограничат производительность до O(n).

Ссылки

  1. ^ "Release 1.0.2". 12 января 2024 г. Получено 19 января 2024 г.
  2. ^ Варда, Кентон. "Cap'n Proto Schema Language". Архивировано из оригинала 2015-03-17 . Получено 2020-09-05 .
  3. ^ Денхардт, Ян (июнь 2019 г.). «Критика языка Cap'n Proto Schema». zenhack.net . Архивировано из оригинала 2019-06-26 . Получено 2020-10-10 .
  4. ^ Варда, Кентон. "Cap'n Proto: Introduction". Домашняя страница Cap'n Proto . Архивировано из оригинала 2015-03-17 . Получено 2020-11-09 .
  5. ^ ab Varda, Kenton. "Cap'n Proto: Encoding Spec". Cap'n Proto . Архивировано из оригинала 2015-03-17.
  6. ^ Варда, Кентон. "FAQ § Как сделать поле "обязательным", как в Protocol Buffers?". Cap'n Proto . Архивировано из оригинала 2015-03-18 . Получено 2020-09-05 .
  7. ^ "Cap'n Proto: Schema Language". capnproto.org . Получено 10.10.2020 .
  8. ^ ab "Cap'n Proto: Cap'n Proto, FlatBuffers и SBE". capnproto.org . Получено 10.10.2020 .
  9. ^ Ричардсон, Кори (октябрь 2016 г.). «Robigalia: операционная система для современной эпохи». robigalia.gitlab.io . Архивировано из оригинала 2018-09-15 . Получено 2020-10-10 .
  10. ^ Кентон, Варда (3 мая 2017 г.). «Почему не предполагается, что состояние в памяти будет в объектах Cap'n Proto / Protobuf?». Hacker News (news.ycombinator.com) . Получено 10 октября 2020 г.
  11. ^ Naughton, Chris (24 августа 2018 г.). "Protocol Benchmarks". Github . Архивировано из оригинала 2018-08-30 . Получено 2020-09-05 .
  12. ^ Парими, Динеш (2019). «Сокращение налогов на центры обработки данных: повышение эффективности WSC за счет ускорения буфера протокола» (PDF) . Архивировано (PDF) из оригинала 2020-09-06 . Получено 2020-09-05 .
  13. ^ "Cap'n Proto: Дорожная карта". capnproto.org . Получено 10.10.2020 .
  14. ^ ab "Roadmap". Cap'n Proto . 2021-03-13. Архивировано из оригинала 2015-03-17.
  15. ^ "Cap'n Proto: C++ RPC". capnproto.org . Получено 10.10.2020 .
  16. ^ "RPC Protocol". Cap'n Proto . Архивировано из оригинала 2015-03-18.
  17. ^ «Почему flatbuffers вместо capnp?».
  18. ^ Варда, Кентон (13 марта 2017 г.). «Команда Sandstorm присоединяется к Cloudflare». Sandstorm.io . Архивировано из оригинала 2017-03-13 . Получено 2020-09-05 .
  19. ^ Zhi, Jiale (2013). "Введение в lua-capnproto: лучшая сериализация в Lua". Архивировано из оригинала 2014-03-06 . Получено 2020-09-05 .