Cap'n Proto 1.0
(capnproto.org)- RPC cancellation की opt-in विधि
context.allowCancellation()call से बदलकर schema केallowCancellationannotation पर शिफ्ट कर दी गई है - जिन users ने
context.allowCancellation()का उपयोग नहीं किया है, उन्हें 1.0 upgrade के समय कोई बदलाव करने की जरूरत नहीं है, और cancellation default रूप से अभी भी allowed नहीं है - 1.0 एक long-term support (LTS) प्रकृति की release है, और 1.0 branch में bugfixes को लंबे समय तक backport करने की योजना है
- Cap’n Proto RPC performance सुधारों में RPC implementation और KJ I/O framework में memory allocation घटाना, कुछ RPC protocol messages को छोड़ना, और छोटे message buffering में सुधार के जरिए syscalls कम करना शामिल है
- KJ अब MacOS और BSD परिवार में asynchronous I/O handling के लिए
kqueue()का उपयोग करता है, जो पहले के धीमेpoll()-based तरीके से बदलाव है - KJ HTTP client और server implementation अब
CONNECTmethod को support करते हैं capnp::RevocableServerजोड़ा गया है, जो ऐसे objects को RPC wrapper के रूप में export करते समय use-after-free bugs से बचने में मदद करने वाली संरचना देता है जिनकी lifetime wrapper control नहीं करता- 2.0 development नए
v2branch पर आगे बढ़ेगा, और योजना है किmasterbranch 1.0 LTS branch बने ताकि existing projects बदलावों से break न हों - 2.0 की योजना serialization format या RPC protocol में backward-incompatible बदलावों की नहीं है, बल्कि C++ API और KJ-केंद्रित बदलावों की है; अन्य भाषाओं में लिखी applications प्रभावित नहीं होंगी
- 2.0 की योजना में C++20 या C++23 compiler requirement, C++20 coroutine का उपयोग, exception disabled और no-RTTI mode support बंद करना,
kj::Maybeऔरkj::AsyncOutputStreamAPI बदलाव आदि शामिल हैं
3 टिप्पणियां
ओह.. यह आखिरकार आ ही गया
Hacker News की रायें
Cap'n Proto और Sandstorm कम्युनिटी के लिए एक बेहद दुखद खबर साझा कर रहा हूँ। Go implementation के मुख्य contributors में से एक Ian Denhardt (HN पर zenhack) का कुछ हफ्ते पहले अचानक निधन हो गया। पिछले 3 सालों में हमने साथ बहुत काम किया था और दोस्त बन गए थे, इसलिए यह बहुत बड़ा नुकसान महसूस हो रहा है
अब project lead के रूप में मुझे Ian की बड़ी कमी पूरी करनी होगी, इसलिए अगर आप project में योगदान दे सकते हैं तो मदद की बहुत ज़रूरत है। अगर आप C++, Rust आदि दूसरी implementations के contributor या maintainer हैं, तो मैं आपसे ज़रूर संपर्क करना चाहूँगा। Ian के काम को आगे बढ़ाने के लिए बहुत होशियार लोगों के साथ काम करना होगा
RIP Ian, तुम्हारे साथ काम करते हुए मैंने सचमुच बहुत कुछ सीखा। संपर्क: https://github.com/lthibault, https://matrix.to/#/#go-capnp:matrix.org, Telegram @lthibault, gmail louist87
मैं भविष्य से मुँह नहीं मोड़ता, लेकिन ज़िंदगी की छोटी-छोटी चीज़ों का ज़्यादा आनंद लेने की कोशिश करने लगा हूँ। Ian ने एक अद्भुत विरासत छोड़ी है, जिसने बहुत से लोगों को छुआ। RIP Ian
Cap'n Proto के अलावा promise pipelining वाले protocols इतने कम हैं, यह हैरान करने वाला है। दिमाग में आने वाला दूसरा उदाहरण सिर्फ 9p है, लेकिन 9p कोई general-purpose protocol नहीं है
https://capnproto.org/news/2013-12-13-promise-pipelining-cap...
फिर भी यह ऐसा feature है जो ज्यादा व्यापक रूप से इस्तेमाल हो सकता था
उदाहरण के लिए, client Joe Service A को call करता है और उसके promised result को Service B को pass कर देता है, तो Service B को उस promise result को पाने के लिए Service A पर remote call करना पड़ेगा
इस समय security boundaries तुरंत complex हो जाती हैं। delegation model कैसे होगा यह भी समस्या है, लेकिन उससे भी गंभीर बात यह है कि backpressure खत्म हो जाता है। अगर client Joe Service A पर हजारों calls बना दे और अभी materialize न हुए results को Service B को pass कर दे, तो Service A DDoS की तरह flood हो सकता है और Service B timeout हो सकता है
हालांकि promise pipelining के लिए client support भी चाहिए। अगर user कई walk issue करे, तो क्या कोई 9p client है जो पहले walk response का इंतजार किए बिना सब भेज देता हो, यह जानना चाहूंगा
साथ ही 9p सिर्फ file descriptors के लिए promise pipelining देता है। सिर्फ इससे भी बहुत कुछ किया जा सकता है, लेकिन अगर directory की सभी files पढ़नी हों, तो read issue करने के बाद उस read result के आधार पर walk कर पाना चाहिए, और लगता है 9p इसे support नहीं करता। मेरी remote system call protocol library rsyscall में यह सच में support है
मुझे याद है कि Mark Miller ने बाद में JavaScript promises proposal भी लिखा था। हालांकि RPC extension साकार नहीं हुआ, और उसके बजाय हमें async/await मिला, जो pipelining के साथ बहुत मेल खाता नहीं दिखता
E के तरीके से distributed authority system बनाने की ज्यादा हालिया कोशिशें, Spritely Goblins और OCapN, भी pipelining को pursue करती हैं, इसलिए cap-talk में हों तो real use cases भले कम हों, कुछ और मिलते-जुलते protocols के बारे में सुनने को मिल सकता है
हालांकि feature शानदार है, promise pipelining के लिए शायद असली explicit promises के साथ programming करनी पड़ती है, और यह कितना tricky हो सकता है यह पहले से अच्छी तरह पता है
दूसरी तरफ, यानी event loop और cooperative concurrent “active objects” की तरफ, एक दिलचस्प और कम-ज्ञात idea DCOM/COM+ के causality IDs हैं। यह reentrancy को control करने का साधन है; Microsoft docs में CoGetCurrentLogicalThreadId और Effective COM में CALLTYPE_TOPLEVEL_CALLPENDING पर चर्चा देखें। बाद में शायद Win8/UWP के ASTA में इसे नए feature की तरह बेचने की कोशिश की गई थी
[1] http://erights.org/elib/distrib/captp/index.html
[2] http://erights.org/talks/thesis/index.html
[3] https://spritely.institute/goblins/
[4] https://github.com/ocapn/ocapn
[5] https://groups.google.com/g/captalk/
[6] https://learn.microsoft.com/openspecs/windows_protocols/ms-d...
[7] https://learn.microsoft.com/windows/win32/api/combaseapi/nf-...
[8] https://archive.org/details/effectivecom50wa00boxd/page/150
[9] https://devblogs.microsoft.com/oldnewthing/20210224-00/?p=10...
दूसरी स्थिति किसी तरह संभव लगती है, लेकिन पहली result list में values की संख्या वगैरह पर निर्भर करती है
रिलीज़ के लिए बधाई। 10 साल बाद आया है, तो वाकई काफी उत्साहजनक लग रहा होगा। आगे दूसरी भाषाओं के implementations पर भी और काम होगा या नहीं, यह जानने की उत्सुकता है
फॉर्मैट का आइडिया मुझे सच में बहुत पसंद है, लेकिन हमारे stack की मुख्य भाषाओं को इतना support नहीं मिलता कि हम उन्हें product में इस्तेमाल करना चाहें
अफसोस है, लेकिन यहां कुछ नया promise करना मुश्किल है। Cap'n Proto पर काम मेरे मुख्य project, Cloudflare Workers runtime, की जरूरतों से चलता है, और वह मुख्य रूप से C++ है। यह Go और Rust services के साथ भी interact करता है, और वे implementations वहां अपना काम करती दिखती हैं
दूसरे शब्दों में, Cap'n Proto एक open source project है और मैं चाहता हूं कि यह लोगों के लिए उपयोगी हो, लेकिन यह कोई product नहीं है जिसे मैं बेचने की कोशिश कर रहा हूं, इसलिए इसे सभी से adopt करवाने पर कोई खास focus नहीं है। हमेशा की तरह, contributions का स्वागत है
एक स्थिति में बड़ा बदलाव हो सकता है: अगर Cloudflare यह तय करे कि Cap'n Proto को Workers platform की public feature बनाया जाए। तब कई भाषाओं में इसे सच में polish करने की सीधी जरूरत पैदा होगी। इस पर कभी-कभी चर्चा होती है, लेकिन फिलहाल कोई योजना नहीं है
अगर आजमाना चाहें तो कर सकते हैं। लोग शायद काफी सहयोगी होंगे। बस यह जान लें कि काम बहुत ज्यादा है
थोड़ा background जोड़ूं तो, Kenton ने Google का internal proto system कई साल तक चलाया, फिर छोड़ने के बाद अपना open source version बनाया
अगर Cloudflare में कोई कर्मचारी Cap'n Proto को protobuf जैसी दूसरी चीजों के बजाय चुनने में शामिल रहा हो, तो मैं जानना चाहूंगा कि किन बातों पर विचार किया गया था। मैं समझना चाहता हूं कि क्या वे कारण मेरे लिए भी महत्वपूर्ण हैं, या फिर जब तक मैं बहुत बड़े scale से deal नहीं कर रहा, उन्हें ignore कर सकता हूं
आज भी Cloudflare की data pipeline, यानी edge पर logs और analytics बनाने वाला system, काफी हद तक Cap'n Proto serialization पर आधारित है। मैं personally उस project में ज्यादा शामिल नहीं था
Cloudflare Workers के मामले में, मैंने project शुरू किया था, इसलिए मैंने अपनी चीज इस्तेमाल की। शायद यह वह explanation नहीं है जो आप चाहते हैं
फिर भी, मुझे लगता है कि Cap'n Proto का RPC protocol alternatives की तुलना में कहीं ज्यादा expressive है, जिससे Workers Runtime के sandboxing implementation और Durable Objects जैसी distributed system features को implement करने में बहुत मदद मिली। https://blog.cloudflare.com/introducing-workers-durable-obje...
अगर आप Parquet जैसे column-oriented format के बजाय record जैसी data shape चुनते हैं, और ऐसा format चाहते हैं जिसमें upfront parsing time लगभग 0 हो, तो options काफी कम रह जाते हैं। पढ़ते समय field values बदलें तो marshaling हो सकती है
https://capnproto.org/news/2014-06-17-capnproto-flatbuffers-... में इस trade-off पर बात की गई है
Cap'n Proto मूल रूप से https://sandstorm.io/ के लिए बनाया गया था, और Kenton ने Cloudflare में hire होने के बाद जो काम किया होगा, वह आखिरकार Cloudflare Workers तक पहुंचा होगा
एक और consideration: https://github.com/google/flatbuffers/issues/2#issuecomment-...
मेरी समझ के मुताबिक, इस पूरे system को बनाने वाले मुख्य engineer Albert Strasheim ने प्रमुख serialization options को benchmark किया था, और पाया था कि Cap'n Proto protobuf से काफी तेज है
इसका एक बेहतरीन C++ implementation था, और इसे nginx में इस्तेमाल किया जा सकता था। जहां तक याद है, थोड़ा Lua भी शामिल था। Consumer side पर इस्तेमाल हो रहे Go implementation में rough edges थे, लेकिन जरूरी core हिस्सों को लोग ठीक कर पाए
Cloudflare ने हमेशा machine cost efficiency को महत्व दिया है, इसलिए उस समय की performance requirements को देखते हुए यह स्वाभाविक choice थी। Data team में रहते हुए Cap'n Proto के साथ काम करना काफी आसान था, और central schema repository में proto definitions share करने का तरीका भी अच्छे से काम करता था
Cap'n Proto का OCapN standardization work में हिस्सा लेना देखकर उत्साह है। सोच रहा हूं कि क्या यह Cap'n Proto 2.0 work का हिस्सा बनेगा
https://github.com/ocapn/ocapn
मुझे OCapN पसंद है, लेकिन अभी मेरे पास इतने सारे काम हैं कि personally कितना समय दे पाऊंगा, पता नहीं। काश मैं बेहतर खबर दे पाता, लेकिन यह हम सभी के लिए दुखद क्षति है
मैंने Cap'n Proto इस्तेमाल नहीं किया है, लेकिन protocol में required fields समस्या क्यों बनते हैं, यह समझाने वाले kentonv के बेहद उपयोगी FAQ जवाब [1] के लिए आभारी हूँ
जब भी लोग पूछते हैं कि protobuf 3 में required fields क्यों नहीं हैं, तो मैं अक्सर इसे link करता हूँ
[1] https://capnproto.org/faq.html#how-do-i-make-a-field-require...
इसलिए “illegal states को unrepresentable बनाओ” वाला व्यापक रूप से दोहराया जाने वाला mantra यहाँ लागू नहीं होता
https://github.com/stepchowfun/typical#asymmetric-fields-can...
required fields को सुरक्षित रूप से जोड़ने और हटाने के लिए, Typical optional और required fields के बीच की intermediate state, asymmetric, उपलब्ध कराता है। किसी struct का asymmetric field लिखने वाले के लिए required और पढ़ने वाले के लिए optional माना जाता है। optional fields के विपरीत, asymmetric fields को सुरक्षित रूप से required में promote किया जा सकता है या वापस उलटा किया जा सकता है
application code पर निर्भर रहने के बजाय, काश कोई parameter होता जिससे required message validation को on/off किया जा सके। application के अंदर या message bus में इसे बंद किया जा सकता है, लेकिन आम तौर पर on होने पर यह developers के लिए काफी मददगार होता
[1] https://capnproto.org/faq.html#how-do-i-make-a-field-require...
Go के interfaces में मुझे सच में जो बात पसंद है, वह यह है कि मैं केवल वही remotely type कर सकता हूँ जो इस्तेमाल करता हूँ और बाकी को skip कर सकता हूँ। service जिन contract changes का इस्तेमाल भी नहीं करती, उनके कारण outage होना न मजेदार है, न ढूँढना आसान
शानदार उपलब्धि है। ईमानदारी से कहूँ तो मैं Cap'n Proto recommend नहीं करूँगा। C++ API बहुत अटपटा है
zero-copy parsing का लाभ भी उम्मीद से कम है। usability अटपटी होने के कारण संभावना कम है कि आप data को लगातार Cap'n Proto data structures में रखना चाहेंगे, और 99% मामलों में अंततः अपने data structures में copy करेंगे
इस तरह के binary implementation के लिए दुनिया काफी हद तक Protobuf पर settle हो चुकी है, इसलिए दूसरे systems के साथ friction भी अधिक है
मैंने इसे केवल serialization के लिए इस्तेमाल किया है। RPC side शायद अधिक आकर्षक हो सकती है
काश Protobuf/gRPC के बजाय Thrift सफल हुआ होता। उससे पहले या बाद में मैंने जो भी देखा, उससे इसका design कहीं बेहतर और flexible था। लगता है यह मुख्यतः खराब documentation के कारण गायब हुआ, और शायद पीछे कोई बड़ा नाम न होना भी वजह रही होगी
जिन use cases में zero-copy बहुत महत्वपूर्ण नहीं है, उनके लिए मैं हमेशा Cap'n Proto में “plain C structs” या उसके करीब किसी रूप का इस्तेमाल करने वाला, और protobuf की तरह एक-copy serialization देने वाला optional alternative API जोड़ना चाहता था, लेकिन अभी तक कर नहीं पाया
हालांकि व्यक्तिगत रूप से मुझे serialization की तुलना में RPC protocol में कहीं अधिक रुचि रही है। मुझे लगता है RPC protocol लगभग हर non-trivial use case में वास्तविक paradigm shift है
खैर, binary serialization की मुख्य समस्या schema और message versioning, और delta encoding है। इन दोनों को ignore कर दें तो flat binary serialization trivial है
ऐसी कोई library नहीं है जो ऊपर की दोनों चीज़ों को अच्छी तरह handle करने वाला समाधान दे
capnp का आइडिया मुझे हमेशा पसंद आया है, लेकिन आखिरकार यह एक message encoding protocol है, और फिर भी मेरे server architecture को कैसे बनाना चाहिए, इस पर इसकी राय होना मुझे खटकता है
gRPC में भी यह समस्या निश्चित रूप से है, लेकिन वह protobuf से बहुत साफ़ तौर पर अलग है, और protobuf में gRPC से जुड़ी कुछ सुविधाएँ ज़रूर हैं
इसी उलझाव की वजह से capnp से तुलना करते समय मैं हर बार flatbuffers या protobuf की तरफ झुक जाता हूँ। खासकर इसलिए कि fb और pb implementations कहीं ज़्यादा सरल हो गए हैं, और security व maintainability के लिहाज़ से मैं simplicity को बहुत अहम मानता हूँ
अच्छे third-party language implementations की कमी भी मुझे इस निर्णय के सही होने का सीधा संकेत लगती है। bus factor और long-term viability भी बहुत खराब हैं। simplicity हावी रहती है
Rust version भी अपना खुद का normative lifestyle मांगता है। उनमें से बहुत-सी बातें zero-copy worldview में समझ आती हैं, लेकिन फिर भी कई expressions को मुश्किल बना देती थीं और docs भी पढ़ने में कठिन थे
इसलिए केवल इसी वजह से भी मैं आम तौर पर flatbuffers चुनता हूँ
फिर भी उम्मीद है कि कभी cap'n'proto की सचमुच ज़रूरत और उपयोगिता वाली स्थिति आएगी, और वर्षों से इसे आज़माने के लिए fork किए गए कई hobby projects में से कम से कम एक तो पूरा करना चाहता हूँ। इसमें high-quality engineering लगी है, यह बात सही है
नया तो नहीं है, लेकिन सोच रहा हूँ कि क्या नाम Star Trek Voyager को जानबूझकर दी गई tribute है, या कोई और reference है जिसे मैं नहीं जानता
https://memory-alpha.fandom.com/wiki/Captain_Proton
Cap'n Proto नाम का मतलब मूल रूप से Capabilities and Protobufs था। यह Protocol Buffers आधारित capability-based RPC protocol था। लेकिन शुरुआती दौर में मुझे एक पूरी तरह अलग serialization format आज़माने का मन हुआ। फिर भी “Proto” protocol के अर्थ में अब भी सही था, इसलिए नाम बनाए रखा
“cerealization protocol” वाला pun दरअसल किसी और ने मुझे बताया था, लेकिन मैंने तुरंत उसे logo में जोड़ दिया
लगता है यह Serialization/RPC है, शायद टाइपो है।