Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DeserializingConsumer does not return a regular Message when used with AvroDeserializer #1800

Open
1 of 7 tasks
InterferencePattern opened this issue Aug 19, 2024 · 6 comments

Comments

@InterferencePattern
Copy link

InterferencePattern commented Aug 19, 2024

Description

The Message object returned by DeserializingConsumer.value() doesn't appear to match the signature- it can return a dict, for example, and not only a str or bytes.

How to reproduce

  1. Use AvroDeserializer to create DeserializingConsumer
  2. Use .poll() method to return message
  3. Message.value() should contain deserialized dictionary instead of str or bytes

I wonder if the DeserializingConsumer needs a DeserializedMessage, with something like the following:

class DeserializedMessage(Message):
    def value(self, payload=None) -> dict:
        return super().value(payload)

Checklist

Please provide the following information:

  • confluent-kafka-python and librdkafka version (confluent_kafka.version() and confluent_kafka.libversion()): ('2.3.0', 33751040), ('2.3.0', 33751295)
  • Apache Kafka broker version:
  • Client configuration: {...}
  • Operating system:
  • Provide client logs (with 'debug': '..' as necessary)
  • Provide broker log excerpts
  • Critical issue
@InterferencePattern
Copy link
Author

@pranavrth might be the contributor most familar with the DeserializingConsumer

@pranavrth
Copy link
Member

You need to use key.deserializer or value.deserializer config to make it work with deserializer otherwise you will get the message in str or bytes.

@InterferencePattern
Copy link
Author

InterferencePattern commented Aug 20, 2024

That's exactly what I'm saying. This issue isn't that it doesn't work- it does.

But the Message.value() return from a DeserializingConsumer is a dictionary, right? If so, this doesn't conform to the output in the Message documentation and should be its own class.

I would offer to define such a class (like in the original description above), but the original Message class is not defined in Python.

@pranavrth
Copy link
Member

But the Message.value() return from a DeserializingConsumer is a dictionary, right?

No, it depends on the value serializer that is provided. If no serializer is provided, it is same as what a normal consumer would return i.e. byte/str.

@InterferencePattern InterferencePattern changed the title DeserializingConsumer does not return a regular Message DeserializingConsumer does not return a regular Message when used with AvroDeserializer Aug 27, 2024
@InterferencePattern
Copy link
Author

InterferencePattern commented Aug 27, 2024

Okay, I've narrowed the Issue title to indicate that this is true for the AvroDeserializer. It's really just a matter of changing the expected output type to be more inclusive of the possible values.

@pranavrth
Copy link
Member

I would let @rayokota handle from here whose team deals with Schema Registry.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants