9 पॉइंट द्वारा GN⁺ 2025-11-01 | 2 टिप्पणियां | WhatsApp पर शेयर करें
  • Apache Fory Rust एक अत्यंत उच्च-गति serialization performance और automatic reference management देने वाला cross-language serialization framework है
  • Rust की zero-copy तकनीक और type safety के आधार पर, यह circular references·trait objects·schema evolution को अपने आप संभालता है
  • IDL files या code generation के बिना Rust, Python, Java, Go जैसी कई भाषाओं के बीच data exchange को सपोर्ट करता है
  • benchmark नतीजों के अनुसार, इसने JSON·Protobuf की तुलना में 10~20 गुना से भी अधिक तेज़ processing speed दर्ज की
  • microservices·data pipelines·real-time systems जैसे high-performance environments में इसका उपयोग बहुत मूल्यवान है

serialization की दुविधा और Apache Fory Rust का आगमन

  • मौजूदा serialization तरीकों में speed·flexibility·language compatibility में से किसी एक से समझौता करना पड़ता था
    • manual binary formats तेज़ होते हैं, लेकिन schema changes के प्रति कमज़ोर
    • JSON/Protobuf लचीले हैं, लेकिन 10 गुना से अधिक performance overhead लाते हैं
    • मौजूदा solutions में language-specific features के लिए पर्याप्त support नहीं है
  • Apache Fory Rust performance और flexibility दोनों एक साथ देता है, और IDL·manual schema management की ज़रूरत नहीं पड़ती

प्रमुख विशेषताएँ

  • 1. वास्तविक cross-language support

    • एक ही binary protocol को Java, Python, C++, Go आदि में साझा किया जा सकता है
    • Rust में serialize किया गया data Python में उसी रूप में deserialize किया जा सकता है
    • schema files·code generation·version mismatch जैसी समस्याएँ नहीं हैं, जिससे multi-language microservices के बीच data exchange सरल हो जाता है
  • 2. automatic circular/shared reference handling

    • ज़्यादातर frameworks जहाँ असफल होते हैं, उन circular reference structures को यह अपने आप track और preserve करता है
    • एक ही object को कई बार refer करने पर भी सिर्फ एक बार serialize किया जाता है, और reference identity बनी रहती है
    • graph databases·ORM·complex domain models के लिए उपयुक्त
  • 3. trait object serialization

    • Rust के Box आदि trait objects की serialization को सपोर्ट करता है
    • register_trait_type! macro से polymorphic types register किए जा सकते हैं
    • Box, Rc, Arc, dyn Any जैसी कई forms को support करता है
    • plugin systems·heterogeneous collections·extensible architectures बनाना संभव
  • 4. schema evolution (compatible mode)

    • Compatible mode के ज़रिए service versions के बीच schema changes की अनुमति
      • fields जोड़ना·हटाना·क्रम बदलना·optional type conversion संभव
      • type change संभव नहीं
    • zero-downtime deployment और independent microservice evolution के लिए उपयोगी

तकनीकी आधार

  • protocol design

    • संरचना: | fory header | reference meta | type meta | value data |
    • variable-length integers·compressed metadata·reference tracking·little-endian layout लागू
    • shared object deduplication और type metadata compression से performance बेहतर होती है
  • compile-time code generation

    • reflection की जगह macro-based code generation से runtime overhead हटाया गया है
    • #[derive(ForyObject)] macro serialization·deserialization functions अपने आप generate करता है
    • type safety सुनिश्चित, binary size न्यूनतम, IDE autocomplete support
  • architecture composition

    • fory/: high-level API
    • fory-core/: serialization engine (buffer I/O, type registration, meta compression आदि)
    • fory-derive/: procedural macro definitions
    • modular structure के कारण maintainability और extensibility सुनिश्चित

benchmark परिणाम

  • JSON और Protobuf की तुलना में 10~20 गुना से अधिक तेज़ processing speed
  • उदाहरण:
    • 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
  • सभी test cases में Fory ने सर्वोच्च performance दर्ज की

उपयोग परिदृश्य

  • उपयुक्त use cases

    • multi-language microservices: schema files के बिना data exchange
    • high-performance data pipelines: प्रति सेकंड लाखों records की processing
    • complex domain models: circular references·polymorphic structures support
    • real-time systems: 1ms से कम latency, zero-copy deserialization
  • alternatives पर विचार

    • यदि human-readable format चाहिए → JSON/YAML
    • यदि long-term storage format चाहिए → Parquet
    • simple data structures के लिए → serde + bincode

शुरू करना

  • installation

    • Cargo.toml में जोड़ें:
      [dependencies]  
      fory = "0.13"  
      
  • basic serialization example

    • #[derive(ForyObject)] से struct register करने के बाद serialize() / deserialize() का उपयोग करें
    • type ID registration से data consistency बनाए रखें
  • cross-language serialization

    • compatible(true).xlang(true) setting से multi-language compatibility mode सक्षम करें
    • ID या name-based registration (register_by_namespace, register_by_name) support

supported types

  • basic types: bool, integers, floating-point, String
  • collections: Vec, HashMap, BTreeMap, HashSet, Option
  • smart pointers: Box, Rc, Arc, RcWeak, ArcWeak, RefCell, Mutex
  • date/time: chrono types
  • user-defined objects: ForyObject, ForyRow
  • trait objects: Box/Rc/Arc, Rc/Arc

roadmap

  • v0.13 में उपलब्ध

    • static code generation, zero-copy Row format, circular reference tracking, trait object serialization, schema compatibility mode
  • आने वाली सुविधाएँ

    • cross-language reference serialization, partial Row updates

production considerations

  • thread safety: registration पूरा होने के बाद Arc के साथ share किया जा सकता है (Send + Sync)
  • error handling: Result आधारित, type mismatch·buffer shortage आदि के लिए स्पष्ट error classification

दस्तावेज़ और community

  • आधिकारिक दस्तावेज़: fory.apache.org/docs
  • API दस्तावेज़: docs.rs/fory
  • community: GitHub, Slack, Issue Tracker उपलब्ध
  • Apache License 2.0 आधारित open source

निष्कर्ष

  • Apache Fory Rust performance·flexibility·language compatibility के बीच समझौते को हटाने वाला अगली पीढ़ी का serialization framework है
  • macro-based automation, trait object support, circular reference handling के साथ यह development efficiency को अधिकतम करता है
  • microservices·data pipelines·real-time systems में इसे तुरंत उपयोग किया जा सकता है

2 टिप्पणियां

 
qlghwp123 2025-11-01

क्या यह प्रदर्शन वाकई समझ में आता है?

 
GN⁺ 2025-11-01
Hacker News राय
  • नया फ़ॉर्मैट बनाने के बजाय W3C EXI(Binary XML) जैसी मौजूदा तकनीकों की tooling बेहतर करने पर ध्यान देना चाहिए
    सिर्फ़ तेज़ होना काफ़ी नहीं है, और Aeron/SBE जैसी ecosystem-रहित formats का फैलना मुश्किल होता है। XML के पास पहले से वह ecosystem मौजूद है

    • Binary XML encoding कुछ खास परिस्थितियों में उपयोगी है, लेकिन आधुनिक binary serialization formats की तुलना में उतनी कुशल नहीं है
      साथ ही, यह shared references या cyclic references जैसे जटिल object graphs को स्वाभाविक रूप से व्यक्त नहीं कर पाती
      Fory format को शुरू से ही इन समस्याओं को हल करने के लिए डिज़ाइन किया गया था, और यह cross-language compatibility तथा schema evolution को भी सपोर्ट करता है
    • W3C EXI और ASN.1 BER में कौन बेहतर है, यह पक्का नहीं कह सकता, लेकिन मुझे DOP(data-oriented design) वाला approach सही लगता है
      यानी पहले encoding डिज़ाइन की जाए, और फिर वहाँ से languages या clients तक विस्तार किया जाए
  • benchmark निष्पक्ष है या नहीं, इस पर संदेह है
    code link देखने पर लगता है कि Fory struct न होने की स्थिति में serialization के दौरान to/from conversion शामिल है
    इस conversion process में string copies या array reallocation होती है
    वास्तविक सिस्टम में tonic 8KB buffer देता है, इसलिए यह साधारण Vec::default() से ज़्यादा कुशल होगा

    • यह benchmark fair नहीं है
      Xeon Gold 6136 CPU पर यह 10x improvement जैसा दिखता है, लेकिन to/from conversion और Vec copy हटाकर, और 8KB buffer preallocate करने पर असल में यह करीब 3x रह जाता है
      benchmark को Fory-संबंधित code के बिना, पूरी तरह tower service/codec style में दोबारा लिखा जाना चाहिए
      Fory टेस्ट के दौरान writer pool का उपयोग कर रहा है
      संबंधित code देखें
  • लंबे समय तक cross-language compatibility बनाए रखने के लिए IDL-आधारित, formally specified contract ज़रूरी है
    language-first serialization approach शुरुआत में सुविधाजनक लगती है, लेकिन समय के साथ language runtime changes के प्रति संवेदनशील हो जाती है

    • languages बढ़ने के साथ official schema की अहमियत बढ़ती है
      single-language project को IDL के बिना भी सरल रखा जा सकता है, लेकिन तीन या उससे अधिक languages होने पर IDL single source of truth की भूमिका निभाता है
      Apache Fory भविष्य में optional IDL support जोड़ने की योजना बना रहा है, ताकि teams अपनी स्थिति के अनुसार language-first या schema-first approach चुन सकें
  • schema के बिना cross-language shared types कैसे बनाए रखे जाते हैं, यह जानना चाहता हूँ

    • type mapping table मौजूद है
      typed languages में class definitions से schema infer किया जाता है, और untyped languages में code में सीधे annotations जोड़े जाते हैं
      Python उदाहरण यहाँ देखा जा सकता है
    • polyglot teams को मुख्य use case बताने के बावजूद schema file की ज़रूरत नहीं है, यह बात उलझन पैदा करती है
      संबंधित blog post देखें
    • लंबे समय में यह approach कितना अच्छा काम करेगा, इस पर संदेह है
    • production में इसका वास्तविक उपयोग कितना है, इस पर पर्याप्त जानकारी न होने से भरोसा कम होता है
  • CapnProto या Flatbuffers जैसे zero-serialization formats के बजाय Fory क्यों इस्तेमाल करना चाहिए, यह जानना चाहता हूँ
    अगर compression चाहिए तो zstd इस्तेमाल किया जा सकता है
    फिर भी, Fory का व्यापक language support और ease of use प्रभावशाली है
    Python में मैं अब भी dill को पसंद करता हूँ — क्योंकि वह code objects तक serialize कर सकता है
    dill link

    • dill के साथ benchmark तुलना में Fory 20~40x तेज़ और अधिकतम 7x बेहतर compression ratio दिखाता है
      benchmark code देखें
    • Apache Fory को pickle/cloudpickle replacement के रूप में भी इस्तेमाल किया जा सकता है, और यह local functions या classes जैसे code object serialization को भी सपोर्ट करता है
      example link
      pyfory, cloudpickle की तुलना में 3x बेहतर compression ratio दिखाता है, और security audit features के ज़रिए malicious deserialization attacks को रोकता है
  • benchmark link 404 दे रहा था, लेकिन सही link मिल गया

  • नाम को “Fury” से “Fory” करना अफ़सोसजनक लगा
    Fury तेज़ serialization framework के लिए बिल्कुल सही नाम था

    • “Fury” नाम मूल रूप से मैंने रखा था, इसलिए उससे लगाव था, लेकिन मजबूरी में बदलना पड़ा
  • ज़्यादातर binary protocols data size कम करने की कोशिश करते हैं
    Protobuf integer compression(varint, zigzag) का उपयोग करता है
    अगर सिर्फ़ raw TPS की तुलना की जाए, तो C structs को वैसे ही भेज देने वाला “do nothing” approach हमेशा जीत सकता है

    • Fory भी integer compression सपोर्ट करता है, और Protobuf के साथ data size लगभग समान है
      अलग-अलग datasets पर तुलना तालिका भी दी गई है
    • schema compatibility के दो mode मौजूद हैं, लेकिन minor versions के बीच binary compatibility guarantee नहीं है
  • Fory की 4096 type limit क्या पर्याप्त है, यह जानना चाहता हूँ
    संबंधित code देखें

    • हर स्थिति में यह पर्याप्त नहीं होगी, लेकिन ज़रूरत पड़ने पर इसे बढ़ाया जा सकता है
      वास्तव में 4096 से अधिक protocol messages परिभाषित करने वाले मामले बहुत कम देखे हैं
  • Rust benchmark link 404 error दे रहा है
    docs root पर benchmark directory नहीं मिली