confluentinc / confluent-kafka-python

Confluent's Kafka Python Client
http://docs.confluent.io/current/clients/confluent-kafka-python
Other
83 stars 891 forks source link

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

Open InterferencePattern opened 1 month ago

InterferencePattern commented 1 month ago

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:

InterferencePattern commented 1 month ago

@pranavrth might be the contributor most familar with the DeserializingConsumer

pranavrth commented 1 month ago

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 commented 1 month ago

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 commented 1 month ago

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 commented 1 month ago

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 commented 1 month ago

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