[ 
https://issues.apache.org/jira/browse/AVRO-3714?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Martin Tzvetanov Grigorov resolved AVRO-3714.
---------------------------------------------
    Resolution: Won't Fix

Closing as "Won't do".

Good luck!

> Zero-copy (de)serialization - (de)serialization rewrite takeover?
> -----------------------------------------------------------------
>
>                 Key: AVRO-3714
>                 URL: https://issues.apache.org/jira/browse/AVRO-3714
>             Project: Apache Avro
>          Issue Type: Improvement
>          Components: rust
>            Reporter: Ten
>            Priority: Major
>
> Soo... I ended up taking up [this 
> invitation|https://issues.apache.org/jira/browse/AVRO-3631?focusedCommentId=17649163&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-17649163].
>  :)
> Using this library and being severely cpu-capped by the deserialization 
> performance (something I basically never hit with Rust) I've given a go at 
> fixing [https://github.com/flavray/avro-rs/issues/195].
> I initially started writing in the same repository, but as I went through the 
> existing code and noticed so many opportunities for improvement and wanted to 
> try so significantly different design, and as my code was so completely 
> separate and independent from it, I ended up just splitting it out in a 
> separate repository, and somewhat accidentally ended up with a full-featured 
> deserialization library. (For context, I've been a professional Rust 
> developer for years and I've regularly worked with Serde's internals.)
> This deserialization code achieves >10x performance gains, seems simpler to 
> use while still being as flexible as necessary, and passes all the relevant 
> tests I could find (besides 
> [AVRO-3240|https://github.com/apache/avro/pull/1379#issuecomment-1412608332], 
> intentionally, for reason explained there).
> It uses this apache-avro library as a dependency for initial schema parsing.
> It would probably be reasonably easily extendable similarly (using the same 
> pattern) to serializalization, fixing [the currently pending serialization 
> issue|https://issues.apache.org/jira/browse/AVRO-3631?focusedCommentId=17649103&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-17649103].
>  
> There are a couple major design differences:
>  * {{Value}} is removed. Deserialization is a one-step process, which is 
> fully serde-integrated, and leverages its zero-copy features. The output 
> struct can now borrow from the source slice.
>  ** Having an intermediate {{Value}} representation appears to be unnecessary 
> in Rust, as the two use-cases for {{Value}} would seem to be:
>  *** Somewhat-known structure of data but still some amount of dynamic 
> processing -> You can deserialize to somewhat-dynamic rust types, e.g. 
> {{HashMap}}, {{Vec}}... 
>  *** Transcoding to a different serialization format (e.g. JSON) with 
> basically zero structural information -> This can still be achieved in a much 
> more performant and idiomatic manner using 
> [serde_transcode|https://crates.io/crates/serde-transcode].
>  ** The {{Value}} representation hurts performance compared to deserializing 
> right away to the correct struct (especially when said representation 
> involves as many allocations as this one does).
>  * Reader schema concept is removed. It appeared to be unnecessary in Rust, 
> as it is a fully statically typed language, and the [deserialization 
> hints|https://serde.rs/impl-deserializer.html] provided by the struct through 
> the Serde framework combined with the writer schema information give all that 
> is necessary to construct the correct types directly, without the need for a 
> separate schema.
>  ** I expect that any code that currently uses a reader schema could work out 
> of the box with this new deserializer without the need to specify a reader 
> schema at all.
>  ** If needing to convert Avro byte streams from one schema to another, this 
> could likely be achieved simply by plugging the deserializer to the 
> serializer through 
> [serde_transcode|https://crates.io/crates/serde-transcode], as such 
> serializer would ([unlike the current 
> one|https://issues.apache.org/jira/browse/AVRO-3631?focusedCommentId=17649103&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-17649103])
>  combine the types provided from the original struct (or in this case, 
> deserializer) with the schema variant to remap the values in a correct way, 
> while preserving zero-alloc.
>  * Schema representation is reworked to be a pre-computed self-referential 
> graph structure.
>  ** This is what allows for maximum performance when traveling it during 
> de(serialization) operations.
> It supports any schema/deserialization target type combination I could think 
> of (besides [some 
> todo|https://github.com/Ten0/serde_avro_fast/blob/10e6ad00fd5b0770a60ca09b4487aa00e8868313/src/de/deserializer/mod.rs#L282]
>  left in the code), including advanced union usage with (or without) enums, 
> as well as proper Option support. I would encourage you to test any exotic 
> use-case you have in mind and see if that works.
> It is extensively documented (hosted on 
> [docs.rs|https://docs.rs/serde_avro_fast/latest/serde_avro_fast/], so you can 
> browse it easily, while full source code is 
> [here|https://github.com/Ten0/serde_avro_fast]).
> So now my questions mainly are:
>  * Does it look like this should/could be taken over by apache-avro, 
> replacing the implementation originally written by flavray in avro-rs?
>  * Or should I release it as a separate crate?
>  * Can you think of common use-cases that would be prevented by the design 
> choice of completely removing the avro {{Value}} and reader schema concepts 
> from a Rust (de)serialization library?
>  * How is [the per-language-releases 
> project|https://lists.apache.org/thread/2rfnszd4dk36jxynpj382b1717gbyv1y] 
> going? ^^ (Wouldn't like it to take months to get a new feature out if I were 
> to add one ;) )
> Thanks,



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to