Cap'n Proto 1.0
(capnproto.org)- Pembatalan RPC dengan model opt-in diubah dari pemanggilan
context.allowCancellation()menjadi anotasiallowCancellationpada schema - Pengguna yang tidak memakai
context.allowCancellation()tidak perlu melakukan perubahan saat upgrade ke 1.0, dan pembatalan tetap tidak diizinkan secara default - 1.0 adalah rilis bergaya dukungan jangka panjang (LTS), dan ada rencana untuk melakukan backport bugfix ke branch 1.0 dalam jangka panjang
- Peningkatan performa Cap’n Proto RPC mencakup pengurangan alokasi memori pada implementasi RPC dan framework KJ I/O, penghilangan sebagian message protokol RPC, serta pengurangan syscall melalui perbaikan buffering message kecil
- KJ menggunakan
kqueue()untuk menangani I/O asinkron di MacOS dan keluarga BSD, berubah dari pendekatan berbasispoll()yang sebelumnya lebih lambat - Implementasi client dan server HTTP KJ mendukung method
CONNECT capnp::RevocableServerditambahkan untuk menyediakan struktur yang membantu menghindari bug use-after-free saat mengekspor objek yang wrapper-nya tidak mengontrol lifetime sebagai wrapper RPC- Pengembangan 2.0 akan dilakukan di branch
v2yang baru, dan branchmasterdirencanakan menjadi branch 1.0 LTS agar proyek yang sudah ada tidak terganggu oleh perubahan - Rencana 2.0 bukan perubahan yang memutus kompatibilitas mundur pada format serialisasi atau protokol RPC, melainkan perubahan yang berfokus pada C++ API dan KJ, sehingga aplikasi yang ditulis dalam bahasa lain tidak terpengaruh
- Rencana 2.0 mencakup persyaratan compiler C++20 atau C++23, penggunaan coroutine C++20, penghentian dukungan untuk exception disabled dan mode no-RTTI, serta perubahan pada API
kj::Maybedankj::AsyncOutputStream
3 komentar
Oh.. ini akhirnya juga
Opini Hacker News
Menyampaikan kabar yang sangat menyedihkan kepada komunitas Cap'n Proto dan Sandstorm. Ian Denhardt (zenhack di HN), kontributor inti implementasi Go, meninggal dunia secara mendadak beberapa minggu lalu. Karena selama 3 tahun terakhir banyak berkolaborasi dengannya dan menjadi teman, ini terasa sebagai kehilangan besar.
Pada praktiknya, sebagai lead proyek, kini saya harus mengisi kekosongan besar yang ditinggalkan Ian, jadi jika Anda bisa berkontribusi pada proyek ini, bantuan sangat dibutuhkan. Jika Anda kontributor atau maintainer implementasi lain seperti C++, Rust, dan sebagainya, saya sangat ingin Anda menghubungi saya. Untuk meneruskan pekerjaan Ian, saya perlu bekerja bersama orang-orang yang sangat cerdas.
RIP Ian, saya benar-benar belajar banyak saat bekerja bersamamu. Kontak: https://github.com/lthibault, https://matrix.to/#/#go-capnp:matrix.org, Telegram @lthibault, gmail louist87
Saya tidak menutup mata terhadap masa depan, tetapi jadi berusaha lebih menikmati hal-hal kecil dalam hidup. Ian meninggalkan warisan luar biasa yang menyentuh banyak orang. RIP Ian
Di luar Cap'n Proto, mengejutkan bahwa hanya sedikit protokol yang memiliki promise pipelining. Contoh lain yang terlintas hanya 9p, tetapi 9p bukan protokol serbaguna
https://capnproto.org/news/2013-12-13-promise-pipelining-cap...
Meski begitu, fitur ini rasanya layak digunakan lebih luas
Misalnya, jika klien Joe memanggil Service A lalu meneruskan hasil promise itu ke Service B, maka Service B harus melakukan panggilan jarak jauh ke Service A untuk mendapatkan hasil promise tersebut
Pada titik ini batas keamanan langsung menjadi rumit. Model delegasinya sendiri sudah menjadi persoalan, tetapi yang lebih serius adalah hilangnya backpressure. Jika klien Joe membuat ribuan panggilan ke Service A dan meneruskan hasil yang belum diwujudkan ke Service B, Service A bisa dibanjiri seperti DDoS sehingga Service B mengalami timeout
Namun promise pipelining juga memerlukan dukungan klien. Saya penasaran apakah ada klien 9p yang, ketika pengguna menerbitkan beberapa walk, mengirim semuanya tanpa menunggu respons walk pertama
Selain itu, 9p hanya menyediakan promise pipelining untuk file descriptor. Dengan itu saja banyak hal bisa dilakukan, tetapi jika ingin membaca semua file dalam sebuah direktori, seharusnya kita bisa menerbitkan read lalu melakukan walk berdasarkan hasil read tersebut; tampaknya 9p tidak mendukung ini. Di library protokol remote system call saya, rsyscall, hal ini benar-benar didukung
Seingat saya, Mark Miller kemudian juga menulis proposal promise untuk JavaScript. Namun ekstensi RPC-nya tidak terwujud, dan sebagai gantinya kita mendapatkan async/await, yang tampaknya kurang cocok dengan pipelining
Spritely Goblins dan OCapN, upaya yang lebih baru untuk membangun sistem kapabilitas terdistribusi ala E, juga mengejar pipelining, jadi jika Anda berada di cap-talk, kemungkinan Anda bisa mendengar beberapa protokol serupa lagi meskipun kasus penggunaan nyatanya sedikit
Namun meski ini fitur yang keren, promise pipelining tampaknya mengharuskan kita memprogram dengan promise eksplisit sungguhan, dan sudah diketahui betapa rumitnya itu bisa menjadi
Di sisi lain, yaitu event loop dan “active object” dengan eksekusi konkuren kooperatif, ada ide menarik dan kurang dikenal dari DCOM/COM+, yaitu causality IDs. Ini adalah sarana untuk mengendalikan reentrancy; lihat dokumentasi Microsoft tentang CoGetCurrentLogicalThreadId dan pembahasan CALLTYPE_TOPLEVEL_CALLPENDING di Effective COM. Belakangan, tampaknya mereka sempat mencoba menjualnya sebagai fitur baru di ASTA Win8/UWP
[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...
Yang terakhir rasanya mungkin bisa dilakukan dengan suatu cara, tetapi yang pertama bergantung pada jumlah nilai dalam daftar hasil, dan sebagainya
Selamat atas rilisnya. Setelah 10 tahun, pasti rasanya sangat menggembirakan. Saya penasaran apakah ke depannya akan ada lebih banyak pekerjaan pada implementasi bahasa lain
Saya sangat menyukai ide formatnya, tetapi bahasa utama dalam stack kami belum didukung sampai tingkat yang membuat kami ingin memakainya di produk
Sayangnya sulit bagi saya untuk menjanjikan hal baru di sini. Pekerjaan pada Cap'n Proto digerakkan oleh kebutuhan proyek utama saya, runtime Cloudflare Workers, dan itu terutama C++. Ia juga berinteraksi dengan layanan Go dan Rust, dan implementasi terkait tampaknya menjalankan perannya di sana
Dengan kata lain, Cap'n Proto adalah proyek open source dan saya berharap berguna bagi orang-orang, tetapi ini bukan produk yang ingin saya jual, jadi saya tidak secara khusus berfokus membuat semua orang mengadopsinya. Seperti biasa, kontribusi sangat diterima
Satu skenario yang bisa membawa perubahan besar adalah jika Cloudflare memutuskan menjadikan Cap'n Proto sebagai fitur publik di platform Workers. Itu akan menciptakan kebutuhan langsung untuk benar-benar memolesnya di banyak bahasa. Kadang hal ini dibahas, tetapi saat ini belum ada rencana
Kalau ingin mencoba, silakan saja. Kemungkinan orang-orang akan cukup kooperatif. Namun perlu diketahui bahwa pekerjaannya memang sangat banyak
Sebagai latar belakang tambahan, Kenton menjalankan sistem proto internal Google selama bertahun-tahun, lalu setelah keluar membuat versi open source miliknya sendiri
Jika ada karyawan Cloudflare yang terlibat dalam pemilihan Cap'n Proto dibanding alternatif lain seperti protobuf, saya penasaran pertimbangannya apa. Saya ingin tahu apakah alasannya juga penting bagi saya, atau apakah itu hal yang tidak perlu dipikirkan kecuali berurusan dengan skala yang sangat besar
Hingga kini, pipeline data Cloudflare—yakni sistem yang membuat log dan analitik di edge—sebagian besar masih berbasis serialisasi Cap'n Proto. Saya pribadi tidak banyak terlibat dalam proyek itu
Untuk Cloudflare Workers, karena saya yang memulai proyeknya, saya memakai milik saya sendiri. Mungkin itu bukan penjelasan yang Anda cari
Meski begitu, menurut saya protokol RPC Cap'n Proto jauh lebih ekspresif daripada alternatifnya, sehingga sangat membantu dalam implementasi sandboxing Workers Runtime dan fitur sistem terdistribusi seperti Durable Objects. https://blog.cloudflare.com/introducing-workers-durable-obje...
Jika memilih data yang bentuknya lebih dekat ke record, bukan berorientasi kolom seperti Parquet, dan menginginkan format dengan waktu parsing awal yang praktis nol, pilihannya menjadi cukup sedikit. Jika nilai field diubah saat membaca, marshalling masih bisa terjadi
https://capnproto.org/news/2014-06-17-capnproto-flatbuffers-... membahas trade-off ini
Cap'n Proto awalnya dibuat untuk https://sandstorm.io/, dan pekerjaan yang kemungkinan dilakukan Kenton setelah direkrut Cloudflare pada akhirnya mengarah ke Cloudflare Workers
Pertimbangan lain: https://github.com/google/flatbuffers/issues/2#issuecomment-...
Albert Strasheim, engineer inti yang membangun keseluruhan sistem itu, melakukan benchmark terhadap opsi serialisasi yang kuat, dan sejauh yang saya pahami hasilnya menunjukkan Cap'n Proto cukup jauh lebih cepat daripada protobuf
Ada implementasi C++ yang bagus, dan bisa digunakan di nginx. Seingat saya ada sedikit Lua yang juga terlibat. Implementasi Go yang dipakai di sisi konsumsi memiliki beberapa bagian kasar, tetapi bagian inti yang dibutuhkan bisa diperbaiki oleh orang-orang
Cloudflare selalu sangat mementingkan efisiensi biaya mesin, jadi dengan mempertimbangkan kebutuhan performa saat itu, pilihan tersebut terasa wajar. Selama saya berada di tim data, Cap'n Proto cukup mudah dikerjakan, dan cara berbagi definisi proto dari repositori skema pusat juga berjalan baik
Saya antusias melihat Cap'n Proto ikut serta dalam pekerjaan standardisasi OCapN. Saya penasaran apakah ini akan menjadi bagian dari pekerjaan Cap'n Proto 2.0
https://github.com/ocapn/ocapn
Saya menyukai OCapN, tetapi dengan banyaknya pekerjaan yang sedang saya tangani sekarang, saya tidak tahu berapa banyak waktu yang bisa saya curahkan secara pribadi. Saya berharap bisa menyampaikan kabar yang lebih baik, tetapi ini adalah kehilangan tragis bagi kita semua
Saya belum pernah memakai Cap'n Proto, tetapi saya berterima kasih atas jawaban FAQ kentonv yang sangat informatif [1], yang menjelaskan mengapa field wajib menjadi masalah dalam protokol
Saya sering menautkannya setiap kali orang bertanya mengapa protobuf 3 tidak memiliki field
required[1] https://capnproto.org/faq.html#how-do-i-make-a-field-require...
Jadi mantra yang sering diulang, “buat state ilegal tidak mungkin direpresentasikan”, tidak berlaku di sini
https://github.com/stepchowfun/typical#asymmetric-fields-can...
Agar bisa menambahkan dan menghapus field wajib dengan aman, Typical menyediakan asymmetric, yakni keadaan perantara antara field opsional dan field wajib. Field asymmetric dalam sebuah struct dianggap wajib bagi penulis, dan opsional bagi pembaca. Berbeda dengan field opsional, field asymmetric dapat dipromosikan dengan aman menjadi wajib, atau dikembalikan sebaliknya
Daripada bergantung pada kode aplikasi, saya berharap ada parameter untuk menyalakan dan mematikan validasi pesan wajib. Di dalam aplikasi atau message bus bisa dimatikan, tetapi secara umum jika menyala itu sangat membantu developer
[1] https://capnproto.org/faq.html#how-do-i-make-a-field-require...
Hal yang sangat saya sukai dari interface di Go adalah saya bisa mengetikkan secara remote hanya bagian yang saya gunakan dan melewati sisanya. Layanan yang gagal karena perubahan kontrak yang bahkan tidak dipakainya itu tidak menyenangkan, dan sulit ditemukan
Ini pencapaian yang hebat. Kalau boleh jujur, saya tidak akan merekomendasikan Cap'n Proto. API C++-nya sangat canggung
Manfaat zero-copy parsing juga lebih kecil dari yang diharapkan. Karena usability-nya canggung, kemungkinan kecil Anda ingin terus menyimpan data dalam struktur data Cap'n Proto, dan 99% akhirnya akan menyalinnya ke struktur data sendiri
Dunia pada umumnya sudah menetap pada Protobuf untuk implementasi biner semacam ini, sehingga gesekan dengan sistem lain juga lebih besar
Saya hanya pernah memakainya untuk serialisasi. Sisi RPC mungkin bisa lebih menarik
Saya benar-benar berharap Thrift yang berhasil, bukan Protobuf/gRPC. Desainnya jauh lebih bagus dan fleksibel daripada apa pun yang pernah saya lihat sebelum maupun sesudahnya. Sepertinya ia menghilang terutama karena dokumentasinya buruk, dan mungkin juga karena tidak ada nama besar di belakangnya
Untuk use case ketika zero-copy tidak terlalu penting, saya selalu ingin menambahkan API alternatif opsional ke Cap'n Proto yang memakai “struct C biasa” atau bentuk yang mendekatinya, dan menyediakan serialisasi dengan satu kali copy seperti protobuf, tetapi belum sempat melakukannya
Namun secara pribadi, saya jauh lebih tertarik pada protokol RPC daripada serialisasi. Saya pikir protokol RPC adalah perubahan paradigma nyata untuk hampir semua use case yang tidak trivial
Bagaimanapun, masalah utama serialisasi biner adalah manajemen versi skema dan pesan, serta delta encoding. Jika keduanya diabaikan, serialisasi biner datar itu sepele
Tidak ada library yang menyediakan solusi yang menangani kedua hal di atas dengan baik
Saya selalu menyukai ide capnp, tetapi pada akhirnya yang mengganggu adalah fakta bahwa, sebagai protokol encoding pesan, ia juga punya opini sampai ke bagaimana saya harus merancang arsitektur server saya
gRPC jelas juga punya masalah seperti ini, tetapi ia terpisah sangat jelas dari protobuf, meskipun protobuf memang punya fitur terkait gRPC
Karena keterkaitan seperti ini, setiap kali membandingkannya dengan capnp saya jadi cenderung memilih flatbuffers atau protobuf. Terutama karena implementasi fb dan pb jauh lebih sederhana, dan saya sangat menghargai kesederhanaan dari sisi keamanan dan pemeliharaan
Kurangnya implementasi bahasa pihak ketiga yang bagus juga saya anggap sebagai sinyal langsung bahwa penilaian ini masuk akal. Bus factor dan kelangsungan hidup jangka panjangnya juga sangat buruk. Kesederhanaanlah yang menang
Versi Rust-nya juga menuntut gaya hidup normatifnya sendiri. Banyak di antaranya masuk akal dalam worldview zero-copy, tetapi tetap saja membuat berbagai bentuk ekspresi menjadi sulit dan dokumentasinya juga sulit dibaca
Jadi, karena alasan ini saja biasanya saya memilih flatbuffers
Meski begitu, saya berharap suatu hari akan ada situasi ketika cap'n'proto diperlukan dan berguna, dan saya ingin menyelesaikan setidaknya salah satu dari beberapa proyek hobi yang sudah saya fork selama bertahun-tahun untuk mencobanya. Memang benar ada engineering berkualitas tinggi di dalamnya
Ini bukan hal baru, tetapi saya penasaran apakah namanya memang penghormatan yang disengaja untuk Star Trek Voyager, atau ada referensi lain yang tidak saya ketahui
https://memory-alpha.fandom.com/wiki/Captain_Proton
Nama Cap'n Proto awalnya berarti Capabilities and Protobufs. Itu adalah protokol RPC berbasis kapabilitas yang didasarkan pada Protocol Buffers. Namun sejak awal saya jadi ingin mencoba format serialisasi yang sepenuhnya berbeda. Meski begitu, “Proto” tetap cocok karena berarti protokol, jadi nama itu dipertahankan
Permainan kata “cerealization protocol” sebenarnya diberitahukan oleh orang lain kepada saya, tetapi saya langsung menambahkannya ke logo
Sepertinya itu maksudnya Serialization/RPC, jadi mungkin ada typo.