Cap'n Proto 1.0
(capnproto.org)- RPC iptali için opt-in yöntemi,
context.allowCancellation()çağrısından şemadakiallowCancellationannotation’ına değiştirildi context.allowCancellation()kullanmayan kullanıcıların 1.0’a yükseltirken değişiklik yapması gerekmiyor; cancellation varsayılan olarak izin verilmeyen durumda kalmaya devam ediyor- 1.0, uzun süreli destek (LTS) niteliğinde bir sürüm; bugfix’lerin 1.0 branch’ine uzun vadede backport edilmesi planlanıyor
- Cap’n Proto RPC performans iyileştirmeleri kapsamında RPC implementasyonu ve KJ I/O framework’ünde bellek ayırmaları azaltıldı, bazı RPC protocol message’ları atlandı ve küçük message buffering iyileştirilerek syscall sayısı azaltıldı
- KJ, MacOS ve BSD türevlerinde asenkron I/O işlemleri için
kqueue()kullanıyor; önceki daha yavaşpoll()tabanlı yöntemden geçildi - KJ HTTP client ve server implementasyonları
CONNECTmethod’unu destekliyor capnp::RevocableServereklendi; wrapper’ın lifetime’ını kontrol etmediği nesneleri RPC wrapper olarak export ederken use-after-free bug’larından kaçınmaya yardımcı olan bir yapı sunuyor- 2.0 geliştirmesi yeni
v2branch’inde yürütülecek;masterbranch’inin mevcut projelerin değişiklikler nedeniyle bozulmaması için 1.0 LTS branch’i olması planlanıyor - 2.0 planı, serialization format’ında veya RPC protocol’ünde geriye uyumsuz değişiklikler değil, C++ API’si ve KJ odaklı değişiklikler içeriyor; başka dillerde yazılmış uygulamalar etkilenmeyecek
- 2.0 planında C++20 veya C++23 compiler gereksinimi, C++20 coroutine kullanımı, exception disabled ve no-RTTI mode desteğinin kaldırılması,
kj::Maybevekj::AsyncOutputStreamAPI değişiklikleri gibi başlıklar yer alıyor
3 yorum
Oo.. bu sonunda geldi
Hacker News görüşleri
Cap'n Proto ve Sandstorm topluluklarına çok üzücü bir haber veriyorum. Go uygulamasının kilit katkıcılarından Ian Denhardt (HN'de zenhack) birkaç hafta önce aniden hayatını kaybetti; son 3 yılda birlikte çokça çalışıp arkadaş olduğumuz için büyük bir kayıp hissediyorum.
Fiilen proje lideri olarak artık Ian'ın bıraktığı büyük boşluğu doldurmam gerekiyor; projeye katkıda bulunabilirseniz yardıma gerçekten çok ihtiyacımız var. C++, Rust vb. diğer uygulamaların katkıcıları veya bakımcılarıysanız mutlaka iletişime geçmek isterim. Ian'ın çalışmalarını sürdürebilmek için çok zeki insanlarla birlikte çalışmam gerekecek.
Huzur içinde yat Ian; birlikte çalışırken senden gerçekten çok şey öğrendim. İletişim: https://github.com/lthibault, https://matrix.to/#/#go-capnp:matrix.org, Telegram @lthibault, gmail louist87
Geleceği görmezden gelmiyorum ama hayatın küçük şeylerinden daha fazla keyif almaya çalışır oldum. Ian pek çok insana dokunan harika bir miras bıraktı. Huzur içinde yat Ian.
Cap'n Proto dışında promise pipelining özelliğine sahip protokollerin bu kadar az olması şaşırtıcı. Aklıma gelen başka tek örnek 9p; 9p ise genel amaçlı bir protokol değil
https://capnproto.org/news/2013-12-13-promise-pipelining-cap...
Yine de daha yaygın kullanılmayı hak eden bir özellik
Örneğin istemci Joe, Service A'yı çağırıp vaat edilen sonucu Service B'ye geçirirse, Service B'nin bu promise sonucunu almak için Service A'ya uzaktan çağrı yapması gerekir
Bu noktada güvenlik sınırları hemen karmaşıklaşır. Yetkilendirme/devretme modelini nasıl kuracağınız da sorun, ama daha ciddi olan backpressure'ın ortadan kalkması. İstemci Joe, Service A'ya binlerce çağrı oluşturup henüz somutlaşmamış sonuçları Service B'ye geçirirse, Service A DDoS benzeri bir yükle karşılaşıp Service B'nin zaman aşımına düşmesine yol açabilir
Ancak promise pipelining istemci desteği de gerektirir. Kullanıcı birden çok walk gönderdiğinde, ilk walk yanıtını beklemeden hepsini gönderen bir 9p istemcisi var mı merak ediyorum
Ayrıca 9p, promise pipelining'i yalnızca dosya tanıtıcıları için sunuyor. Sırf bununla bile çok şey yapılabilir, ama bir dizindeki tüm dosyaları okumak istiyorsanız read gönderip sonra o read'in sonucuyla walk yapabilmeniz gerekir; 9p bunu desteklemiyor gibi. Benim uzak sistem çağrısı protokolü kütüphanem rsyscall ise bunu gerçekten destekliyor
Hatırladığım kadarıyla Mark Miller daha sonra JavaScript promise önerisini de yazdı. Ancak RPC uzantıları hayata geçmedi; bunun yerine pipelining ile pek uyumlu görünmeyen async/await'e sahip olduk
E tarzında dağıtık bir yetki sistemi kurmaya yönelik daha yeni girişimler olan Spritely Goblins ve OCapN de pipelining'in peşinde; bu yüzden cap-talk'taysanız, gerçek kullanım örnekleri az olsa bile benzer birkaç protokol daha duyabilirsiniz
Yine de harika bir özellik olsa da promise pipelining, gerçek ve açık promise'lerle programlamayı gerektiriyor gibi; bunun ne kadar çetrefilli hale gelebileceği zaten iyi biliniyor
Karşı tarafta, yani event loop ve işbirlikçi eşzamanlı “aktif nesneler” tarafında ilginç ve daha az bilinen bir fikir olarak DCOM/COM+'ın causality IDs mekanizması var. Bu, yeniden girişliliği kontrol etmenin bir yolu; Microsoft belgelerindeki CoGetCurrentLogicalThreadId ve Effective COM'daki CALLTYPE_TOPLEVEL_CALLPENDING tartışmalarına bakılabilir. Daha sonra Win8/UWP'deki ASTA'da yeni bir özellikmiş gibi pazarlanmaya çalışılmış gibi görünüyor
[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...
İkincisi bir şekilde mümkün gibi, ancak ilki sonuç listesindeki değer sayısı gibi şeylere bağlı
Çıkışı kutlarım. 10 yılın ardından gerçekten heyecan verici olmalı. Bundan sonra başka dil implementasyonları üzerinde de daha fazla çalışma olup olmayacağını merak ediyorum
Format fikrini gerçekten çok seviyorum ama bizim stack’imizin ana dilleri, üründe kullanmak isteyeceğimiz kadar desteklenmiyor
Ne yazık ki burada yeni bir şey vaat etmem zor. Cap'n Proto üzerindeki çalışmalar, ana projem olan Cloudflare Workers runtime’ının ihtiyaçlarıyla yönleniyor ve bu da ağırlıklı olarak C++. Go ve Rust servisleriyle de etkileşime giriyor; ilgili implementasyonlar orada işlerini görüyor gibi görünüyor
Başka bir deyişle Cap'n Proto bir açık kaynak projesi ve insanlara faydalı olmasını umuyorum; ancak satmaya çalıştığım bir ürün değil, bu yüzden herkesin benimsemesini sağlamaya özel olarak odaklanmıyorum. Her zamanki gibi katkılara açığız
Büyük bir değişimin olabileceği durumlardan biri, Cloudflare’ın Cap'n Proto’yu Workers platformunun herkese açık bir özelliği yapmaya karar vermesi olurdu. O zaman birçok dilde gerçekten cilalanması için doğrudan bir ihtiyaç doğar. Zaman zaman bunu konuşuyoruz ama şu anda bir plan yok
Denemek isterseniz deneyebilirsiniz. İnsanların oldukça işbirliğine açık olma ihtimali yüksek. Sadece işin çok fazla olduğunu bilmek gerekir
Biraz arka plan eklemek gerekirse, Kenton Google’ın kurum içi proto sistemini yıllarca işlettikten sonra ayrıldı ve kendi açık kaynak sürümünü yaptı
Cloudflare çalışanları arasında Cap'n Proto’yu protobuf gibi başka şeyler yerine seçme sürecine dahil olan biri varsa, hangi değerlendirmelerin yapıldığını merak ediyorum. Bu nedenlerin benim için de önemli olup olmadığını, yoksa muazzam ölçeklerle uğraşmıyorsam kafaya takmam gerekip gerekmediğini bilmek isterim
Bugün de Cloudflare’ın veri pipeline’ı, yani edge’de log ve analitik üreten sistem, büyük ölçüde Cap'n Proto serileştirmesine dayanıyor. Ben o projeye kişisel olarak pek dahil olmadım
Cloudflare Workers’a gelince, projeyi ben başlattığım için kendi şeyimi kullandım. Muhtemelen istediğiniz açıklama bu değildir
Yine de Cap'n Proto’nun RPC protokolünün alternatiflerden çok daha ifade gücü yüksek olduğu için Workers Runtime’ın sandboxing implementasyonunda ve Durable Objects gibi dağıtık sistem özelliklerinin implementasyonunda çok yardımcı olduğunu düşünüyorum. https://blog.cloudflare.com/introducing-workers-durable-obje...
Parquet gibi sütun odaklı değil de kayda daha yakın formda veri seçiyor ve ön ayrıştırma süresi fiilen 0 olan bir biçim istiyorsanız seçenekler oldukça azalıyor. Okurken alan değerlerini değiştirirseniz marshalling söz konusu olabilir
https://capnproto.org/news/2014-06-17-capnproto-flatbuffers-... bu ödünleşimi ele alıyor
Cap'n Proto aslında https://sandstorm.io/ için yapılmıştı; Kenton’ın Cloudflare’a alındıktan sonra yaptığı o çalışma da sonunda Cloudflare Workers’a uzanmış olmalı
Bir başka değerlendirme noktası: https://github.com/google/flatbuffers/issues/2#issuecomment-...
Bunun tamamını kuran kilit mühendis Albert Strasheim, güçlü serileştirme seçeneklerini benchmark etmişti; anladığım kadarıyla Cap'n Proto’nun protobuf’tan epey hızlı olduğu sonucuna varmıştı
Harika bir C++ implementasyonu vardı ve nginx içinde kullanılabiliyordu. Hatırladığım kadarıyla biraz Lua da işin içindeydi. Tüketici tarafında kullanılan Go implementasyonunda pürüzlü yerler vardı ama gereken temel kısımları insanlar düzeltebiliyordu
Cloudflare makine maliyeti verimliliğini her zaman önemsemiştir; bu yüzden o dönemdeki performans gereksinimleri düşünüldüğünde doğal bir seçimdi. Veri ekibindeyken Cap'n Proto ile çalışmak oldukça kolaydı ve merkezi şema deposundan proto tanımlarını paylaşma yöntemi de iyi işliyordu
Cap'n Proto’nun OCapN standardizasyonu çalışmalarına katılması beni heyecanlandırıyor. Bunun Cap'n Proto 2.0 çalışmalarının bir parçası olup olmayacağını merak ediyorum
https://github.com/ocapn/ocapn
OCapN’i seviyorum ama şu anda üstlendiğim çok iş olduğu için kişisel olarak ne kadar zaman ayırabileceğimi bilmiyorum. Daha iyi haberler verebilmeyi isterdim ama bu hepimiz için trajik bir kayıp
Cap'n Proto'yu hiç kullanmadım ama protokolde zorunlu alanların neden sorun olduğunu açıklayan kentonv'nin çok yararlı FAQ yanıtı [1] için minnettarım
İnsanlar protobuf 3'te neden required alan olmadığını her sorduğunda sık sık bağlantısını veriyorum
[1] https://capnproto.org/faq.html#how-do-i-make-a-field-require...
Dolayısıyla “geçersiz durumları temsil edilemez kıl” diye sıkça tekrarlanan mantra burada geçerli değil
https://github.com/stepchowfun/typical#asymmetric-fields-can...
Zorunlu alanları güvenle ekleyip kaldırabilmek için Typical, isteğe bağlı alanlarla zorunlu alanlar arasında bir ara durum olan asymmetric'i sunuyor. Bir struct'taki asymmetric alan, yazan taraf için zorunlu, okuyan taraf için isteğe bağlı kabul edilir. İsteğe bağlı alanların aksine, asymmetric alanlar güvenle zorunluya yükseltilebilir ya da tersine geri alınabilir
Uygulama koduna güvenmek yerine zorunlu mesaj doğrulamasını açıp kapatabilen bir parametre olsaydı iyi olurdu. Uygulama içinde veya mesaj veri yolunda kapatılabilir, ama genel olarak açık olduğunda geliştiriciye büyük yardım sağlar
[1] https://capnproto.org/faq.html#how-do-i-make-a-field-require...
Go'nun arayüzlerinde gerçekten sevdiğim şey, yalnızca kullandığım kısmı uzaktan tiplendirip geri kalanını atlayabilmem. Bir servisin kullanmadığı sözleşme değişikliği yüzünden arızalanması hoş değil ve bulması da zor
Harika bir başarı. Dürüst olmak gerekirse Cap'n Proto'yu tavsiye etmezdim. C++ API'si oldukça hantal
Sıfır kopyalı ayrıştırmanın faydası da beklediğimden daha küçük. Kullanımı hantal olduğu için veriyi Cap'n Proto veri yapıları içinde tutmak isteme olasılığınız düşük; %99 ihtimalle sonunda kendi veri yapılarınıza kopyalayacaksınız
Bu tür ikili uygulamalarda dünya büyük ölçüde Protobuf üzerinde uzlaştığı için diğer sistemlerle sürtünme de daha fazla
Ben yalnızca serileştirme amacıyla kullandım. RPC tarafı daha çekici olabilir
Protobuf/gRPC yerine Thrift başarılı olsaydı gerçekten iyi olurdu. Öncesinde ya da sonrasında gördüğüm her şeyden çok daha iyi ve esnek tasarlanmıştı. Sanırım çoğunlukla berbat dokümantasyon yüzünden kayboldu; arkasında büyük bir ismin olmaması da muhtemelen bir nedendi
Sıfır kopyanın pek önemli olmadığı kullanım durumları için Cap'n Proto'ya “düz C struct'ları” ya da ona yakın bir biçim kullanan ve protobuf gibi bir kez kopyalayarak serileştirme yapan isteğe bağlı alternatif bir API eklemek hep istemiştim, ama henüz yapamadım
Bununla birlikte kişisel olarak RPC protokolü tarafını serileştirmeden çok daha ilginç buldum. RPC protokolünün, önemsiz olmayan neredeyse her kullanım senaryosunda gerçek bir paradigma değişimi olduğunu düşünüyorum
Her hâlükârda ikili serileştirmenin başlıca sorunu şema ve mesaj sürümleme ile delta kodlamadır. Bu ikisini görmezden gelirseniz düz ikili serileştirme basittir
Yukarıdaki iki konuyu da iyi ele alan bir çözüm sunan kütüphane yok
capnp'nin fikrini hep sevmişimdir; ama sonuçta bir mesaj kodlama protokolü olmasına rağmen sunucu mimarimi nasıl tasarlamam gerektiği konusunda da görüş sahibi olması beni rahatsız ediyor
gRPC'de de kesinlikle böyle bir sorun var, ama protobuf'tan çok net biçimde ayrılmış durumda; protobuf'ta gRPC ile ilgili bazı özellikler olsa da
Bu iç içelik yüzünden capnp ile her karşılaştırdığımda flatbuffers veya protobuf tarafına kayıyorum. Özellikle fb ve pb uygulamaları çok daha basit hale geldiği, güvenlik ve bakım açısından da basitliğe çok yüksek değer verdiğim için
İyi üçüncü taraf dil uygulamalarının azlığını da bu yargının doğru olduğuna dair doğrudan bir işaret olarak görüyorum. Bus factor ve uzun vadeli yaşama şansı da çok kötü. Basitlik belirleyici oluyor
Rust sürümü de kendine özgü normatif bir yaşam tarzı gerektiriyor. Bunların çoğu sıfır kopya dünya görüşünde mantıklı, ama yine de birçok ifadeyi zorlaştırıyor ve dokümantasyonu da okumayı güçleştiriyordu
Bu yüzden sırf bu nedenle bile genelde flatbuffers'ı seçiyorum
Yine de bir gün cap'n'proto'nun gerekli ve faydalı olduğu bir durumla karşılaşmayı umuyor, yıllardır denemek için fork'ladığım çeşitli hobi projelerinden en az birini bitirmek istiyorum. İçinde yüksek kaliteli mühendislik olduğu kesin
Yeni değil, ama adının Star Trek Voyager'a bilinçli bir saygı duruşu mu olduğunu, yoksa bilmediğim başka bir referans mı bulunduğunu merak ediyorum
https://memory-alpha.fandom.com/wiki/Captain_Proton
Cap'n Proto adı aslında Capabilities and Protobufs anlamına geliyordu. Protocol Buffers tabanlı, yetenek tabanlı bir RPC protokolüydü. Ama erken dönemde tamamen farklı bir serileştirme biçimi denemek istedim. Yine de “Proto” protokol anlamında hâlâ uyduğu için adı korudum
“cerealization protocol” kelime oyununu aslında bana başka biri söylemişti, ama hemen logoya ekledim
Sanırım Serialization/RPC olmalı; muhtemelen bir yazım hatası var.