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