9 poin oleh GN⁺ 2025-11-01 | 2 komentar | Bagikan ke WhatsApp
  • Apache Fory Rust adalah framework serialisasi lintas bahasa yang menghadirkan performa serialisasi ultra-cepat dan manajemen referensi otomatis
  • Berbasis teknologi zero-copy dan type safety Rust, dengan penanganan otomatis untuk referensi siklik, objek trait, dan evolusi skema
  • Mendukung pertukaran data antar berbagai bahasa seperti Rust, Python, Java, dan Go tanpa file IDL atau code generation
  • Hasil benchmark menunjukkan kecepatan pemrosesan lebih dari 10–20x dibanding JSON dan Protobuf
  • Sangat bernilai untuk lingkungan berperforma tinggi seperti microservices, pipeline data, dan sistem real-time

Dilema serialisasi dan kemunculan Apache Fory Rust

  • Metode serialisasi lama memiliki keterbatasan karena harus mengorbankan salah satu dari kecepatan, fleksibilitas, atau kompatibilitas bahasa
    • Format biner buatan tangan cepat, tetapi rapuh terhadap perubahan skema
    • JSON/Protobuf fleksibel, tetapi memiliki overhead performa lebih dari 10x
    • Solusi lama juga kurang mendukung fitur khas tiap bahasa
  • Apache Fory Rust menghadirkan performa dan fleksibilitas sekaligus, tanpa perlu IDL atau pengelolaan skema manual

Fitur utama

  • 1. Dukungan lintas bahasa yang sesungguhnya

    • Protokol biner yang sama digunakan bersama di Java, Python, C++, Go, dan lainnya
    • Data yang diserialisasi di Rust bisa langsung dideserialisasi di Python
    • Tanpa file skema, code generation, atau masalah ketidakcocokan versi, sehingga pertukaran data antar microservice multibahasa menjadi lebih sederhana
  • 2. Penanganan otomatis referensi siklik dan referensi bersama

    • Struktur referensi siklik yang biasanya gagal ditangani banyak framework dapat dilacak dan dipertahankan secara otomatis
    • Walaupun objek yang sama direferensikan berkali-kali, ia hanya diserialisasi sekali, sehingga identitas referensinya tetap terjaga
    • Cocok untuk database graf, ORM, dan model domain yang kompleks
  • 3. Serialisasi objek trait

    • Mendukung serialisasi objek trait Rust seperti Box
    • Tipe polimorfik dapat didaftarkan dengan makro register_trait_type!
    • Mendukung berbagai bentuk seperti Box, Rc, Arc, dyn Any
    • Memungkinkan implementasi sistem plugin, koleksi heterogen, dan arsitektur yang dapat diperluas
    Iklan
  • 4. Evolusi skema (mode kompatibel)

    • Mode Compatible memungkinkan perubahan skema antar versi layanan
      • Penambahan, penghapusan, perubahan urutan field, serta konversi tipe opsional dimungkinkan
      • Perubahan tipe tidak diperbolehkan
    • Berguna untuk deployment tanpa downtime dan evolusi microservice yang independen

Fondasi teknis

  • Desain protokol

    • Struktur: | fory header | reference meta | type meta | value data |
    • Menerapkan bilangan bulat panjang variabel, metadata terkompresi, pelacakan referensi, dan layout little-endian
    • Performa ditingkatkan melalui deduplikasi objek bersama dan kompresi metadata tipe
  • Code generation saat compile time

    • Code generation berbasis makro alih-alih refleksi menghilangkan overhead runtime
    • Makro #[derive(ForyObject)] secara otomatis menghasilkan fungsi serialisasi dan deserialisasi
    • Memberikan type safety, ukuran biner minimum, dan dukungan autocomplete IDE
  • Komposisi arsitektur

    • fory/: API tingkat tinggi
    • fory-core/: mesin serialisasi (buffer I/O, registrasi tipe, kompresi metadata, dll.)
    • fory-derive/: definisi procedural macro
    • Struktur yang termodularisasi meningkatkan kemudahan perawatan dan ekstensibilitas
    Iklan

Hasil benchmark

  • Kecepatan pemrosesan lebih dari 10–20x dibanding JSON dan Protobuf
  • Contoh:
    • simple_struct(small) → Fory 35,729,598 TPS / JSON 10,167,045 / Protobuf 8,633,342
    • person(medium) → Fory 3,839,656 TPS / JSON 337,610 / Protobuf 369,031
  • Di semua test case, Fory mencatat performa terbaik

Skenario penggunaan

  • Kasus penggunaan yang cocok

    • Microservice multibahasa: pertukaran data tanpa file skema
    • Pipeline data berperforma tinggi: memproses jutaan record per detik
    • Model domain kompleks: mendukung referensi siklik dan struktur polimorfik
    • Sistem real-time: latensi di bawah 1 ms, deserialisasi zero-copy
  • Pertimbangan alternatif

    • Jika memerlukan format yang mudah dibaca manusia → JSON/YAML
    • Jika memerlukan format penyimpanan jangka panjang → Parquet
    • Untuk struktur data sederhana → serde + bincode
Iklan

Memulai

  • Instalasi

    • Tambahkan ke Cargo.toml:
      [dependencies]  
      fory = "0.13"  
      
  • Contoh serialisasi dasar

    • Daftarkan struct dengan #[derive(ForyObject)], lalu gunakan serialize() / deserialize()
    • Menjaga konsistensi data melalui registrasi type ID
  • Serialisasi lintas bahasa

    • Aktifkan mode kompatibilitas multibahasa dengan pengaturan compatible(true).xlang(true)
    • Mendukung registrasi berbasis ID atau nama (register_by_namespace, register_by_name)

Tipe yang didukung

  • Tipe dasar: bool, integer, floating point, String
  • Koleksi: Vec, HashMap, BTreeMap, HashSet, Option
  • Smart pointer: Box, Rc, Arc, RcWeak, ArcWeak, RefCell, Mutex
  • Tanggal/waktu: tipe chrono
  • Objek buatan pengguna: ForyObject, ForyRow
  • Objek trait: Box/Rc/Arc, Rc/Arc
Iklan

Roadmap

  • Tersedia di v0.13

    • Code generation statis, format Row zero-copy, pelacakan referensi siklik, serialisasi objek trait, mode kompatibilitas skema
  • Fitur yang direncanakan

    • Serialisasi referensi lintas bahasa, pembaruan Row parsial

Pertimbangan produksi

  • Thread safety: setelah registrasi selesai, dapat dibagikan dengan Arc (Send + Sync)
  • Penanganan error: berbasis Result, dengan pemisahan jelas untuk kesalahan seperti ketidakcocokan tipe dan buffer yang kurang

Dokumentasi dan komunitas

Kesimpulan

  • Apache Fory Rust adalah framework serialisasi generasi berikutnya yang menghapus kompromi antara performa, fleksibilitas, dan kompatibilitas bahasa
  • Otomatisasi berbasis makro, dukungan objek trait, dan penanganan referensi siklik memaksimalkan efisiensi pengembangan
  • Dapat langsung dimanfaatkan pada microservices, pipeline data, dan sistem real-time

2 komentar

 
qlghwp123 2025-11-01

Apakah performa ini masuk akal?

 
GN⁺ 2025-11-01
Komentar Hacker News
  • Daripada membuat format baru, lebih baik fokus meningkatkan tooling untuk teknologi yang sudah ada seperti W3C EXI (Binary XML)
    Hanya cepat saja tidak cukup; format tanpa ekosistem seperti Aeron/SBE sulit menyebar luas. XML sudah memiliki ekosistem tersebut

    • Encoding Binary XML berguna dalam situasi tertentu, tetapi tidak seefisien format serialisasi biner modern
      Selain itu, ia tidak bisa merepresentasikan grafik objek kompleks seperti referensi bersama atau referensi siklik secara alami
      Format Fory sejak awal dirancang untuk mengatasi masalah ini sekaligus mendukung kompatibilitas lintas bahasa dan evolusi skema
    • Saya tidak tahu mana yang lebih baik antara W3C EXI atau ASN.1 BER, tetapi menurut saya pendekatan DOP (data-oriented design) itu tepat
      Artinya, lebih baik merancang encoding terlebih dahulu lalu memperluasnya balik ke bahasa atau klien
  • Saya ragu benchmark-nya adil
    Jika melihat tautan kode, saat bukan struct Fory, proses serialisasi memasukkan konversi to/from
    Dalam proses konversi ini terjadi penyalinan string dan realokasi array
    Di sistem nyata, tonic menyediakan buffer 8KB, jadi kemungkinan lebih efisien daripada sekadar Vec::default()

    • Benchmark ini tidak adil
      Pada CPU Xeon Gold 6136 memang terlihat seperti peningkatan 10x, tetapi jika konversi to/from dan penyalinan Vec dihapus serta buffer 8KB dialokasikan lebih dulu, hasil nyatanya sekitar 3x
      Benchmark harus ditulis ulang dengan gaya tower service/codec yang sama sekali tidak memiliki kode khusus Fory
      Fory menggunakan writer pool selama pengujian
      Lihat kode terkait
  • Dalam jangka panjang, untuk menjaga kompatibilitas lintas bahasa dibutuhkan kontrak yang dispesifikasikan berbasis IDL
    Pendekatan yang berangkat dari bahasa menuju serialisasi memang nyaman di awal, tetapi lama-kelamaan rentan terhadap perubahan runtime bahasa

    • Semakin banyak bahasa yang terlibat, semakin penting adanya skema resmi
      Proyek satu bahasa bisa tetap sederhana tanpa IDL, tetapi mulai dari tiga bahasa atau lebih, IDL menjadi single source of truth
      Apache Fory berencana menambahkan dukungan IDL secara opsional, sehingga tim bisa memilih pendekatan yang mengutamakan bahasa atau skema sesuai kondisi mereka
  • Saya penasaran bagaimana mereka menjaga tipe bersama lintas bahasa tanpa skema

    • Ada tabel pemetaan tipe
      Pada bahasa bertipe, skema disimpulkan dari definisi kelas, sedangkan pada bahasa tak bertipe, anotasi ditulis langsung di kode
      Contoh Python bisa dilihat di sini
    • Agak membingungkan bahwa mereka menyebut tim multibahasa (polyglot) sebagai use case utama, tetapi pada saat yang sama mengatakan file skema tidak diperlukan
      Lihat postingan blog terkait
    • Saya skeptis apakah pendekatan seperti ini akan berjalan baik dalam jangka panjang
    • Penjelasan tentang seberapa banyak ini dipakai di produksi masih kurang, jadi sulit dipercaya
  • Saya ingin tahu mengapa harus memakai Fory alih-alih format zero-serialization seperti CapnProto atau Flatbuffers
    Jika butuh kompresi, tinggal pakai zstd
    Meski begitu, dukungan bahasa yang luas dan kemudahan penggunaan Fory tetap mengesankan
    Di Python, saya masih lebih suka dill — karena bisa menserialisasi objek kode
    tautan dill

    • Dalam hasil benchmark dibanding dill, Fory menunjukkan kecepatan 20~40x lebih tinggi dan rasio kompresi hingga 7x lebih baik
      Lihat kode benchmark
    • Apache Fory juga bisa dipakai sebagai pengganti pickle/cloudpickle, dan mendukung serialisasi objek kode seperti fungsi atau kelas lokal
      tautan contoh
      pyfory menunjukkan rasio kompresi 3x lebih tinggi dibanding cloudpickle, dan dengan fitur audit keamanan mencegah serangan deserialisasi berbahaya
  • Tautan benchmark sempat 404, tetapi saya menemukan tautan yang benar

  • Agak disayangkan namanya diubah dari “Fury” menjadi “Fory”
    Fury adalah nama yang sangat pas untuk framework serialisasi cepat

    • “Fury” awalnya memang nama yang saya buat sendiri, jadi saya cukup terikat dengannya, tetapi mau bagaimana lagi, memang harus diubah
  • Sebagian besar protokol biner berusaha mengurangi ukuran data
    Protobuf memakai kompresi integer (varint, zigzag)
    Jika hanya membandingkan TPS mentah, pendekatan “do nothing” yang sekadar mengirim struct C apa adanya pasti akan selalu menang

    • Fory juga mendukung kompresi integer, dan ukuran datanya hampir sama dengan Protobuf
      Mereka juga menampilkan tabel perbandingan pada berbagai dataset
    • Ada dua mode kompatibilitas skema, tetapi tidak ada jaminan kompatibilitas biner antar versi minor
  • Saya penasaran apakah batas 4096 tipe di Fory itu cukup
    Lihat kode terkait

    • Mungkin tidak cukup untuk semua kasus, tetapi bisa diperluas jika perlu
      Secara pribadi saya hampir tidak pernah melihat kasus yang mendefinisikan lebih dari 4096 pesan protokol
  • Tautan benchmark Rust menghasilkan error 404
    Di root dokumentasi saya juga tidak bisa menemukan direktori benchmark