cloudevents / sdk-java

Java SDK for CloudEvents
https://cloudevents.github.io/sdk-java/
Apache License 2.0
385 stars 157 forks source link

Modularization: avro module #115

Open fabiojose opened 4 years ago

fabiojose commented 4 years ago

This module implements the Avro Event Format.

This module depend on api one.

When someone wants the avro format to create or read events, they add this module and they concern about potential conflicts with pre-existing dependencies in their projects.

subanasif commented 3 years ago

@slinkydeveloper: I do have implementation of EventFormat interface for avro. However, the implementation class has a setter method for Avro schema since this not defined in EventFormat interface. Hence, following code would be used to get hold of format and serialize.

AvroFormat avroFormat = (AvroFormat) EventFormatProvider
        .getInstance()
        .resolveFormat(AvroFormat.CONTENT_TYPE);
//Set avro schema
avroFormat.setSchema(schema)

Let me know your thoughts.

slinkydeveloper commented 3 years ago

avroFormat.setSchema(schema)

Which schema?

subanasif commented 3 years ago

This is avro schema. That is org.apache.avro.Schema. This could be coming from filesystem or remote repository like schema registry.

slinkydeveloper commented 3 years ago

avro schema of what? of Cloudevents? The one from the spec https://github.com/cloudevents/spec/blob/v1.0/spec.avsc?

subanasif commented 3 years ago

Thats correct. It *.avsc schema

slinkydeveloper commented 3 years ago

Shouldn't this be loaded statically? Can we ship this schema as a resource in the package and then load it statically?

subanasif commented 3 years ago

The schema at https://github.com/cloudevents/spec/blob/v1.0/spec.avsc is just a spec, whereas real schema would have much more details (in data part, with specific field definitions). Hence loading statically as resource won't work. More often, these spec compliant schemas are stored at third-party registries.

slinkydeveloper commented 3 years ago

TBH I'm not an expert of avro, so I can't tell. What I can say is that it sounds weird to me to mutate the internal state of EventFormat in order to provide a custom schema... My expectation is that EventFormat doesn't parse the body, but it just collects it in a raw form (like in json, where it collects the data as json node) and then the user process this raw data into the pojo she/he wants to. I think you should check out this PR where they're working on improving the schema https://github.com/cloudevents/spec/pull/613

yuce commented 3 years ago

@subanasif https://github.com/cloudevents/spec/blob/v1.0/spec.avsc is compiled into Java before shipping, so dynamically loading it is not necessary (although possible). That Avro spec is used by other CE clients, so I don't think it can be changed as long as compatibility with CE 1.0 is desired.

pdebuitlear commented 3 years ago

@subanasif https://github.com/cloudevents/spec/blob/v1.0/spec.avsc is compiled into Java before shipping, so dynamically loading it is not necessary (although possible). That Avro spec is used by other CE clients, so I don't think it can be changed as long as compatibility with CE 1.0 is desired.

I'm not sure that's what is being suggested. @subanasif you mentioned you had an implementation, any chance you could share it for some more context?

pdebuitlear commented 3 years ago

any update on this issue?

alsonlu commented 3 years ago

Is there any update on if/when this will be released?

slinkydeveloper commented 3 years ago

This is just waiting for a contribution to come :smile:

sunng87 commented 3 years ago

Just let you know I have been working on an avro serde impl these days.