Kapitan Proto
Oryginalni autorzy | Kenton Varda |
---|---|
Wersja stabilna | 0.9.1 / 22 września 2021 r
|
Magazyn | |
Napisane w | C++ |
Typ | zdalnego wywoływania procedur , format i biblioteka serializacji , kompilator IDL |
Licencja | Licencja MIT |
Strona internetowa |
Cap'n Proto to format serializacji danych i platforma Remote Procedure Call (RPC) do wymiany danych między programami komputerowymi. Projekt wysokiego poziomu koncentruje się na szybkości i bezpieczeństwie, dzięki czemu nadaje się zarówno do komunikacji sieciowej, jak i międzyprocesowej. Cap'n Proto został stworzony przez byłego opiekuna popularnej struktury Google Protocol Buffers (Kenton Varda) i został zaprojektowany w celu uniknięcia niektórych z jego dostrzeganych niedociągnięć.
Przegląd techniczny
Schemat IDL
Podobnie jak większość frameworków RPC sięgających czasów Sun RPC i OSF DCE RPC (oraz ich obiektowych potomków CORBA i DCOM ), Cap'n Proto używa języka opisu interfejsu (IDL) do generowania bibliotek RPC w różnych językach programowania - automatyzacja wielu szczegółów niskiego poziomu, takich jak obsługa żądań sieciowych, konwersja między typami danych itp. Schemat interfejsu Cap'n Proto wykorzystuje składnię podobną do języka C i obsługuje typowe typy danych pierwotnych (boolean, liczby całkowite, zmiennoprzecinkowe itp.), typy złożone (struktury, listy, wyliczenia), a także typów generycznych i dynamicznych . Cap'n Proto obsługuje również funkcje zorientowane obiektowo, takie jak wielokrotne dziedziczenie, które było krytykowane za swoją złożoność.
@0xa558ef006c0c123 ; #Unikatowe identyfikatory są ręcznie lub automatycznie przypisywane do plików i typów złożonych struct Date @0x5c5a558ef006c0c1 { year @0 :Int16 ; #@n oznaczenia kolejności wartości zostały dodane do miesiąca schematu @1 :UInt8 ; dzień @2 :UInt8 ; } struct Kontakt @ 0xf032a54bcb3667e0 { nazwa @ 0 : Tekst ; urodziny @2 : Data ; #pola można dodawać w dowolnym miejscu w definicji, ale ich numeracja musi odzwierciedlać kolejność dodawania tel. @1 :List(PhoneNumber) ; struct PhoneNumber { #Typy złożone bez statycznego identyfikatora nie mogą być zmieniane, ponieważ identyfikatory automatyczne są generowane deterministycznie numer @0 :Text ; wpisz @1 :TypTelefonu = komórka ; #wartość domyślna enum PhoneType { mobile @0 ; telefon stacjonarny @1 ; } } }
Wartości w komunikatach Cap'n Proto są reprezentowane w formacie binarnym , w przeciwieństwie do kodowania tekstu używanego w formatach „ czytelnych dla człowieka ”, takich jak JSON lub XML . Cap'n Proto stara się dostosować protokół przechowywania/sieci do formatu in-memory, tak aby podczas wczytywania danych do pamięci lub zapisywania danych z pamięci nie był potrzebny krok translacji. Na przykład reprezentacja liczb ( endianność ) została wybrana tak, aby pasowała do reprezentacji najpopularniejszych architektur procesorów. Gdy reprezentacje w pamięci iw protokole sieciowym są zgodne, Cap'n Proto może uniknąć kopiowania i kodowania danych podczas tworzenia lub czytania wiadomości i zamiast tego wskazuje lokalizację wartości w pamięci. Cap'n Proto obsługuje również losowy dostęp do danych, co oznacza, że dowolne pole można odczytać bez konieczności czytania całej wiadomości.
W przeciwieństwie do innych binarnych protokołów serializacji, takich jak XMI , Cap'n Proto uważa szczegółową weryfikację danych na poziomie RPC za antyfunkcję , która ogranicza możliwość ewolucji protokołów. Zostało to poparte doświadczeniami w Google, gdzie zwykła zmiana pola z obowiązkowego na opcjonalny spowodowałaby złożone błędy operacyjne. Schematy Cap'n Proto są zaprojektowane tak, aby były jak najbardziej elastyczne i wypychają walidację danych na poziom aplikacji, umożliwiając dowolne zmienianie nazw pól, dodawanie nowych pól i tworzenie ogólnych typów konkretnych Cap'n Proto jednak sprawdza poprawność granic wskaźników i kontrolę typu poszczególne wartości przy pierwszym dostępie .
Egzekwowanie złożonych ograniczeń schematów wiązałoby się również ze znacznymi kosztami ogólnymi, negując korzyści z ponownego wykorzystania struktur danych w pamięci i zapobiegając losowemu dostępowi do danych. Protokół Cap'n Proto teoretycznie nadaje się do bardzo szybkiej komunikacji międzyprocesowej (IPC) za pośrednictwem niezmiennej pamięci współdzielonej, ale od października 2020 r. Żadna z implementacji nie obsługuje przesyłania danych przez pamięć współdzieloną. Jednak Cap'n Proto jest nadal ogólnie uważany za szybszy niż bufory protokołów i podobne biblioteki RPC.
Praca w sieci
Cap'n Proto RPC obsługuje sieć: obsługuje zarówno rozłączenia, jak i obiecane potokowanie , w którym serwer przesyła dane wyjściowe jednej funkcji do innej. Oszczędza to klientowi podróż w obie strony przy każdym kolejnym wywołaniu do serwera bez konieczności udostępniania dedykowanego interfejsu API dla każdego możliwego wykresu połączeń. Cap'n Proto można nakładać warstwami na TLS, a obsługa Noise Protocol Framework jest na mapie drogowej. Cap'n Proto RPC jest niezależny od transportu, a główna implementacja obsługuje WebSockets, HTTP, TCP i UDP.
Bezpieczeństwo zdolności
Standard Cap'n Proto RPC ma bogaty model bezpieczeństwa oparty na protokole CapTP używanym przez język programowania E.
Od października 2020 r. implementacja referencyjna obsługuje tylko poziom 2.
Przyjęcie
Cap'n Proto został pierwotnie stworzony dla Sandstorm.io, startupu oferującego platformę hostingową aplikacji internetowych z zabezpieczeniami opartymi na możliwościach. Po komercyjnym niepowodzeniu Sandstorm.io zespół programistów został przejęty przez Cloudflare; który używa Cap'n Proto wewnętrznie.