使用confluent_kafka for python

时间:2020-01-05 14:41:06

标签: apache-kafka kafka-rest

到目前为止,我唯一得到的答案是,必须给模式和主题指定相同的名称,然后将它们链接在一起。但是在注册名称为test_topic的架构后,例如:

{
  "type": "record",
  "name": "test_topic",
  "namespace": "com.test",
  "doc": "My test schema",
  "fields": [
    {
      "name": "name",
      "type": "string"
    }
  ]
}

并运行以下命令,它可以毫无问题地插入。

curl -X POST -H "Content-Type: application/vnd.kafka.json.v2+json" -H "Accept: application/vnd.kafka.v2+json" --data '{"records":[{"value":{"name": "My first name"}}]}' "http://localhost/topics/test_topic"

但是当我同时运行以下命令时,它也会插入而不会给出任何错误(注意,我更改了属性名称)

curl -X POST -H "Content-Type: application/vnd.kafka.json.v2+json" -H "Accept: application/vnd.kafka.v2+json" --data '{"records":[{"value":{"test": "My first name"}}]}' "http://localhost/topics/test_topic"

我会怀疑有一条错误消息,说我的数据与该主题的架构不匹配...

我的模式ID是10,所以我知道它正在工作并已注册,但目前还不太有用。

Python代码:

from confluent_kafka import Producer
import socket
import json
conf = {'bootstrap.servers': 'localhost:9092', 'client.id': socket.gethostname()}
producer = Producer(conf)

def acked(err, msg):
    if err is not None:
        print(f'Failed to deliver message: {str(msg)}, {str(err)}')
    else:
        print(f'Message produced: {str(msg)}')

    producer.produce("test_topic", key="key", value=json.dumps({"test": name}).encode('ascii') , callback=acked)

producer.poll(5)

1 个答案:

答案 0 :(得分:2)

您必须为架构和主题指定相同的名称,然后将它们链接在一起

这不是Schema Registry的工作方式。

每个卡夫卡记录都有一个键和一个值。

注册中心的主题并不严格映射到主题。

但是,Kafka客户端(反序列化器)实现将同时使用topic-keytopic-value使用者名称来从注册表中注册/提取模式。

客户端无法告诉注册表将架构放在哪个ID。该逻辑是在服务器端进行计算


我不确定我是否了解您的帖子与REST Proxy的关系,但是您发布的是纯JSON,而不是告诉其数据应为Avro(您使用的标题不正确)

如果使用Avro,则内容类型将为application/vnd.kafka.avro.v2+json

相关问题