Капитан Прото
Оригинальный автор(ы) | Кентон Варда |
---|---|
Стабильная версия | 1.0.2 [ 1 ] ![]() |
Репозиторий | github |
Написано в | С++ |
Тип | удаленного вызова процедур Платформа сериализации , формат и библиотека IDL , компилятор |
Лицензия | МОЯ лицензия |
Веб-сайт | капнпрото |
Cap'n Proto — это формат сериализации данных и платформа удаленного вызова процедур (RPC) для обмена данными между компьютерными программами. Высокоуровневый дизайн ориентирован на скорость и безопасность, что делает его подходящим как для сети, так и для межпроцессного взаимодействия. Cap'n Proto был создан бывшим сопровождающим популярной платформы Google Protocol Buffers (Кентоном Варда) и был разработан, чтобы избежать некоторых из ее предполагаемых недостатков.
Технический обзор
[ редактировать ]IDL-схема
[ редактировать ]Как и большинство фреймворков RPC , начиная с Sun RPC и OSF DCE RPC (и их объектно-ориентированных потомков CORBA и DCOM ), Cap'n Proto использует язык описания интерфейса (IDL) для создания библиотек RPC на различных языках программирования. автоматизация многих деталей низкого уровня, таких как обработка сетевых запросов, преобразование между типами данных и т. д. Схема интерфейса Cap'n Proto использует синтаксис, подобный C , и поддерживает общие типы данных примитивов (логические значения, целые числа, числа с плавающей запятой, и т. д.), составные типы (структуры, списки, перечисления), а также дженерики и динамические типы . [ 2 ] Cap'n Proto также поддерживает объектно-ориентированные функции, такие как множественное наследование, которое критиковали за его сложность. [ 3 ]
@0xa558ef006c0c123; # Unique identifiers are manually or automatically assigned to files and compound types
struct Date @0x5c5a558ef006c0c1 {
year @0 :Int16; # @n marks order values were added to the schema
month @1 :UInt8;
day @2 :UInt8;
}
struct Contact @0xf032a54bcb3667e0 {
name @0 :Text;
birthday @2 :Date; # fields can be added anywhere in the definition, but their numbering must reflect the order in which they were added
phones @1 :List(PhoneNumber);
struct PhoneNumber { # Compound types without a static ID cannot be renamed, as automatic IDs are deterministically generated
number @0 :Text;
type @1 :PhoneType = mobile; # Default value
enum PhoneType {
mobile @0;
landline @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 ]
![]() | Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( март 2021 г. ) |
По состоянию на октябрь 2020 года эталонная реализация поддерживает только уровень 2. [ 14 ]
Сравнение с другими форматами сериализации
[ редактировать ]Cap'n Proto часто сравнивают с другими форматами сериализации с нулевым копированием, такими как FlatBuffers от Google и Simple Binary Encoding (SBE). [ 8 ] [ 17 ]
Принятие
[ редактировать ]Cap'n Proto изначально был создан для Sandstorm.io, стартапа, предлагающего платформу хостинга веб-приложений с безопасностью, основанной на возможностях. После того, как Sandstorm.io потерпел коммерческий провал, команду разработчиков наняла Cloudflare. [ 18 ] который использует Cap'n Proto внутри себя. [ 19 ]
Примечания
[ редактировать ]- ^ В отличие от Apache Arrow , значения в памяти Cap'n Proto не подходят для совместного использования изменяемых данных.
- ^ Пометка поля как обязательного была удалена из протокольных буферов 3 .
- ^ Предполагая, что данные уже выделены (например, в сетевых буферах, прочитаны с диска), доступ становится O(1) . Дополнительные шаги сериализации/десериализации (необходимые для проверки значений) ограничивают производительность до O(n).
Ссылки
[ редактировать ]- ^ «Выпуск 1.0.2» . 12 января 2024 г. Проверено 19 января 2024 г.
- ^ Варда, Кентон. «Язык протосхемы капитана» . Архивировано из оригинала 17 марта 2015 г. Проверено 05 сентября 2020 г.
- ^ Денхардт, Ян (июнь 2019 г.). «Критика языка протосхемы Cap'n» . zenhack.net . Архивировано из оригинала 26 июня 2019 г. Проверено 10 октября 2020 г.
- ^ Варда, Кентон. «Капитан Прото: Введение» . Домашняя страница Cap'n Proto . Архивировано из оригинала 17 марта 2015 г. Проверено 9 ноября 2020 г.
- ^ Jump up to: а б Варда, Кентон. «Cap'n Proto: Спецификация кодирования» . Капитан Прото . Архивировано из оригинала 17 марта 2015 г.
- ^ Варда, Кентон. «Часто задаваемые вопросы § Как сделать поле обязательным, как в протокольных буферах?» . Капитан Прото . Архивировано из оригинала 18 марта 2015 г. Проверено 05 сентября 2020 г.
- ^ «Капитан Прото: Язык схем» . capnproto.org . Проверено 10 октября 2020 г.
- ^ Jump up to: а б «Cap'n Proto: Cap'n Proto, FlatBuffers и SBE» . capnproto.org . Проверено 10 октября 2020 г.
- ^ Ричардсон, Кори (октябрь 2016 г.). «Робигалия: операционная система современной эпохи» . robigalia.gitlab.io . Архивировано из оригинала 15 сентября 2018 г. Проверено 10 октября 2020 г.
- ^ Кентон, Варда (3 мая 2017 г.). «Почему не предполагается, что состояние в памяти должно быть в объектах Cap'n Proto/Protobuf?» . Хакерские новости (news.ycombinator.com) . Проверено 10 октября 2020 г.
- ^ Нотон, Крис (24 августа 2018 г.). «Бенчмарки протокола» . Гитхаб . Архивировано из оригинала 30 августа 2018 г. Проверено 05 сентября 2020 г.
- ^ Парими, Динеш (2019). «Снижение налогов на центры обработки данных: повышение эффективности WSC за счет ускорения буфера протокола» (PDF) . Архивировано (PDF) из оригинала 06 сентября 2020 г. Проверено 05 сентября 2020 г.
- ^ «Капитан Прото: Дорожная карта» . capnproto.org . Проверено 10 октября 2020 г.
- ^ Jump up to: а б «Дорожная карта» . Капитан Прото . 13 марта 2021 г. Архивировано из оригинала 17 марта 2015 г.
- ^ «Cap'n Proto: C++ RPC» . capnproto.org . Проверено 10 октября 2020 г.
- ^ «Протокол RPC» . Капитан Прото . Архивировано из оригинала 18 марта 2015 г.
- ^ «Почему плоские буферы вместо capnp?» .
- ^ Варда, Кентон (13 марта 2017 г.). «Команда Sandstorm присоединяется к Cloudflare» . Песчаная Буря.io. Архивировано из оригинала 13 марта 2017 г. Проверено 05 сентября 2020 г.
- ^ Чжи, Цзялэ (2013). «Представляем lua-capnproto: улучшенная сериализация в Lua» . Архивировано из оригинала 6 марта 2014 г. Проверено 05 сентября 2020 г.