簡體   English   中英

confluent-python 可以生成具有 avro 中的值和字符串中的鍵的數據嗎?

[英]can confluent-python produce data with value in avro and key in string?

我正在使用 python3 和confluent-python向 Kafka 發送消息。 我需要發送帶有 Avro 格式值和鍵作為字符串的數據。 但是我發現 confluent-python 只能在 Avro 中同時發送或在字符串中同時發送。 confluent-python 源代碼如下:

def produce(self, **kwargs):
    """
        Asynchronously sends a message to Kafka by encoding with specified or default Avro schema.

        :param str topic: topic name
        :param object value: An object to serialize
        :param str value_schema: Avro schema for value
        :param object key: An object to serialize
        :param str key_schema: Avro schema for key

        Plus any other parameters accepted by confluent_kafka.Producer.produce

        :raises SerializerError: On serialization failure
        :raises BufferError: If producer queue is full.
        :raises KafkaException: For other produce failures.
    """
    # get schemas from  kwargs if defined
    key_schema = kwargs.pop('key_schema', self._key_schema)
    value_schema = kwargs.pop('value_schema', self._value_schema)
    topic = kwargs.pop('topic', None)
    if not topic:
        raise ClientError("Topic name not specified.")
    value = kwargs.pop('value', None)
    key = kwargs.pop('key', None)

    if value is not None:
        if value_schema:
            value = self._serializer.encode_record_with_schema(topic, value_schema, value)
        else:
            raise ValueSerializerError("Avro schema required for values")

    if key is not None:
        if key_schema:
            key = self._serializer.encode_record_with_schema(topic, key_schema, key, True)
        else:
            raise KeySerializerError("Avro schema required for key")

    super(AvroProducer, self).produce(topic, value, key, **kwargs)

有人知道嗎?

定義一個 PrimitiveSchema - 像這樣的字符串:

key_schema = avro.loads('{"type": "string"}')

並在構建生產者時像這樣使用它:

producer = avro.AvroProducer(config=conf, default_key_schema=key_schema, default_value_schema=your_value_schema)

所以我的解決方法只是更改 Python 代碼以不引發異常。 我假設庫的作者出於某種原因不允許靈活地將模式僅用於鍵或僅用於值,但不知道它是什么。 對於需要在開發中發布此類數據的用例,我認為這是一個不錯的解決方案。

代碼更改在confluent_kafka/avro/__init__.py ,只是刪除了第 87 和 88 行:

84    if key is not None:
85        if key_schema:
86            key = self._serializer.encode_record_with_schema(topic, key_schema, key, True)
87        else:
88            raise KeySerializerError("Avro schema required for key")

你還可以考慮:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM