프로토 캡틴
Cap'n Proto원본 작성자 | 켄턴 바르다 |
---|---|
안정적 해제 | 0.9.1 / 2021년 9월 22일; 전 |
리포지토리 | github |
기록 위치 | C++ |
유형 | 원격 프로시저 호출 프레임워크, 직렬화 형식 및 라이브러리, IDL 컴파일러 |
면허증 | MIT 라이선스 |
웹사이트 | capnproto |
Cap'n Proto는 컴퓨터 프로그램 간 데이터 교환을 위한 데이터 직렬화 형식과 원격 프로시저 호출(RPC) 프레임워크다.높은 수준의 설계는 속도와 보안에 중점을 두어 프로세스 간 통신은 물론 네트워크에도 적합하다.Cap'n Proto는 구글의 인기 있는 프로토콜 버퍼 프레임워크(Kenton Varda)의 전 유지자에 의해 만들어졌으며, 인식된 결함을 피하기 위해 고안되었다.
기술 개요
IDL 스키마
Like most RPC frameworks dating as far back as Sun RPC and OSF DCE RPC (and their object-based descendants CORBA and DCOM), Cap'n Proto uses an Interface Description Language (IDL) to generate RPC libraries in a variety of programming languages - automating many low level details such as handling network requests, converting between data types, etc. Cap'n Proto 인터페이스 스키마는 C와 유사한 구문을 사용하며 공통의 원시적 데이터 유형(부울, 정수, 플로트 등), 복합 유형(구조, 목록, 에넘), 제네릭 및 동적 유형을 지원한다.[1]Cap'n Proto는 다중 상속과 같은 Object Oriented 기능도 지원하는데, 이 기능은 복잡하다는 지적을 받아왔다.[2]
@0xa558ef006c0c123; #유니크 식별자는 수동으로 또는 자동으로 파일 및 복합 유형에 할당됨 날짜 @0x5c5a558ef006c1 {년 @0 :Int16; #@n 표시 순서 값이 스키마 월 @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 an static ID cannot be renamed, as automatic IDs are determinstically 생성된 번호 @0 :Text; type @1 :PhoneType = mobile; #Default value 열거 PhoneType { mobile @0; landline @1; } }}
Cap'n Proto 메시지의 값은 JSON 또는 XML과 같은 "인간 판독 가능" 형식에서 사용하는 텍스트 인코딩과는 반대로 이진법으로 표현된다. Cap'n Proto는 저장/네트워크 프로토콜을 메모리 형식으로 적합하게 만들어 데이터를 메모리로 읽거나 메모리에서 데이터를 쓸 때 변환 단계가 필요하지 않게 하려고 한다.[note 1]예를 들어, 가장 인기 있는 CPU 아키텍처의 표현과 일치하도록 숫자의 표현(내부성)을 선택했다.[3]인메모리 및 유선 프로토콜 표현이 일치하면 Cap'n Proto는 메시지를 만들거나 읽을 때 데이터를 복사하고 인코딩하는 것을 피하고 대신 메모리에 있는 값의 위치를 가리킬 수 있다.Cap'n Proto는 또한 데이터에 대한 무작위 액세스를 지원하는데, 이것은 어떤 필드도 전체 메시지를 읽지 않고도 읽을 수 있다는 것을 의미한다.[4]
Cap'n Proto는 XMI와 같은 다른 이진 직렬화 프로토콜과 달리, RPC 수준에서 세분화된 데이터 검증을 프로토콜의 진화 능력을 제한하는 반기능으로 간주한다.이것은 구글의 경험에 의해 필수에서 선택사항으로 단순히 필드를 변경하면 복잡한 운영 실패를 야기할 수 있다는 것을 알게 되었다.[5][note 2]Cap'n Proto 스키마는 가능한 유연하도록 설계되어 있으며 데이터 검증을 애플리케이션 레벨로 푸시하여 필드 이름을 임의로 변경하고 새 필드를 추가하며 콘크리트 타입 Cap'n Proto가 수행하는[6] 대로 포인터 경계를 확인하고 처음 액세스할 때 개별 값을 검사한다.[4]
복잡한 스키마 제약사항을 적용하면 메모리 내 데이터 구조를 재사용하는 이점을 부정하고 데이터에 대한 무작위 액세스를 방지하면서 상당한 오버헤드가 발생할 수 있다.[note 3][7]Cap'n Proto 프로토콜은 이론적으로 불변의 공유 메모리를 통한 매우 빠른 프로세스 간 통신(IPC)에 적합하지만[8], 2020년 10월 현재 어떤 구현도 공유 메모리를 통한 데이터 전달을 지원하지 않는다.[9]그러나 Cap'n Proto는 여전히 일반적으로 프로토콜 버퍼나 유사한 RPC 라이브러리보다 더 빠른 것으로 간주된다.[10][11]
네트워킹
Cap'n Proto RPC는 네트워크 인식으로, 연결 해제와 약속 파이프라인 처리를 모두 지원하며, 서버에서는 한 기능의 출력을 다른 함수로 파이핑한다.이것은 가능한 모든 통화 그래프에 전용 API를 제공할 필요 없이 클라이언트가 연속 통화당 서버에 대한 라운드 트립을 저장한다.Cap'n Proto는 TLS[12] 위에 레이어드할 수 있으며 노이즈 프로토콜 프레임워크에 대한 지원이 로드맵에 있다.[13]Cap'n Proto RPC는 WebSockets, HTTP, TCP 및 UDP를 지원하는 메인라인 구현으로 전송 불가지론적이다.[14]
역량 보안
Cap'n Proto RPC 표준은 E 프로그래밍 언어가 사용하는 CapTP 프로토콜에 기초한 풍부한 기능 보안 모델을 가지고 있다.[15]
![]() | 이 구간은 확장이 필요하다.덧셈으로 도움도 된다(2021년 3월) |
2020년 10월 현재 기준 구현은 레벨 2만 지원한다.[13]
입양
Cap'n Proto는 원래 기능 기반 보안을 갖춘 웹 애플리케이션 호스팅 플랫폼을 제공하는 스타트업인 Sandstorm.io을 위해 만들어졌다.아마존닷컴이 상업적으로 실패한 후 개발팀은 내부적으로 Cap'n Proto를 사용하는 Cloudflare에 의해 인수되었다.[16][17]
Cap'n Proto는 다양한 언어로 된 코드 생성기를 가지고 있지만, 구현의 미숙성과 상대적으로 적은 수(프로토콜 버퍼나 플랫버퍼에 비해)가 채택의 장벽으로 자주 언급되고 있다.[18][19]
메모들
- ^ Apache Arrow와 달리 Cap'n Proto의 인메모리 값은 변이 가능한 데이터를 공유하기에 적합하지 않다.
- ^ 필요에 따라 필드를 표시하는 것은 프로토콜 버퍼 3에서 제거되었다.
- ^ 데이터가 이미 할당되었다고 가정하면(예: 네트워크 버퍼, 디스크에서 읽기) 액세스는 O(1)가 된다.(값 검사에 필요한 경우) 추가 직렬화/직렬화 단계는 성능을 O(n)로 제한한다.
참조
- ^ Varda, Kenton. "Cap'n Proto Schema Language". Archived from the original on 2015-03-17. Retrieved 2020-09-05.
- ^ Denhardt, Ian (June 2019). "A Critique of the Cap'n Proto Schema Language". zenhack.net. Archived from the original on 2019-06-26. Retrieved 2020-10-10.
- ^ Varda, Kenton. "Cap'n Proto: Introduction". Cap'n Proto Homepage. Archived from the original on 2015-03-17. Retrieved 2020-11-09.
- ^ a b Varda, Kenton. "Cap'n Proto: Encoding Spec". Cap'n Proto. Archived from the original on 2015-03-17.
- ^ Varda, Kenton. "FAQ § How do I make a field "required", like in Protocol Buffers?". Cap'n Proto. Archived from the original on 2015-03-18. Retrieved 2020-09-05.
- ^ "Cap'n Proto: Schema Language". capnproto.org. Retrieved 2020-10-10.
- ^ "Cap'n Proto: Cap'n Proto, FlatBuffers, and SBE". capnproto.org. Retrieved 2020-10-10.
- ^ Richardson, Corey (October 2016). "Robigalia: An Operating System for the Modern Era". robigalia.gitlab.io. Archived from the original on 2018-09-15. Retrieved 2020-10-10.
- ^ Kenton, Varda (May 3, 2017). "Why is not intended that in-memory state be in Cap'n Proto / Protobuf objects?". Hacker News (news.ycombinator.com). Retrieved 2020-10-10.
{{cite web}}
: CS1 maint : url-status (링크) - ^ Naughton, Chris (Aug 24, 2018). "Protocol Benchmarks". Github. Archived from the original on 2018-08-30. Retrieved 2020-09-05.
- ^ Parimi, Dinesh (2019). "Datacenter Tax Cuts: Improving WSC Efficiency Through Protocol Buffer Acceleration" (PDF). Archived from the original on 2020-09-05. Retrieved 2020-09-05.
- ^ "Cap'n Proto: Road Map". capnproto.org. Retrieved 2020-10-10.
- ^ a b "Roadmap". Cap'n Proto. 2021-03-13. Archived from the original on 2015-03-17.
- ^ "Cap'n Proto: C++ RPC". capnproto.org. Retrieved 2020-10-10.
- ^ "RPC Protocol". Cap'n Proto. Archived from the original on 2015-03-18.
- ^ Varda, Kenton (13 Mar 2017). "The Sandstorm Team is joining Cloudflare". Sandstorm.io. Archived from the original on 2017-03-13. Retrieved 2020-09-05.
- ^ Zhi, Jiale (2013). "Introducing lua-capnproto: better serialization in Lua". Archived from the original on 2014-03-06. Retrieved 2020-09-05.
- ^ "gRPC in Production". Hacker News. July 2017.
{{cite web}}
: CS1 maint : url-status (링크) - ^ "reddit/r/rust: Learning Cap'n Proto RPC". 2015. Archived from the original on 2015-03-16.