我有很多微服务在Kafka中读取/编写Avro消息。
模式很棒。 Avro很棒。 但是真的需要架构注册表吗? ?它可以帮助集中架构,是的,但是微服务真的需要查询注册表吗?我不这么认为。
每个微服务都有一个模式副本user.avsc
和一个Avro生成的POJO:User extends SpecificRecord
。我想要每个Schema的POJO,以便在代码中轻松操作。
写给卡夫卡:
byte [] value = user.toByteBuffer().array();
producer.send(new ProducerRecord<>(TOPIC, key, value));
从卡夫卡读书:
User user = User.fromByteBuffer(ByteBuffer.wrap(record.value()));
答案 0 :(得分:1)
Schema Registry为您提供了一种方法,使更多的应用程序和服务可以使用数据,而不仅仅是基于Java的微服务。
例如,您的微服务将数据流式传输到主题,并且您想要将该数据发送到Elasticsearch或数据库。如果您拥有Schema Registry,则可以直接将Kafka Connect连接到该主题,它现在有了该架构,可以创建目标映射或表。如果没有架构注册表,则每个数据使用者都必须以其他方式找出数据架构是什么。
也采取另一种方法-您的微服务想要访问从其他地方(例如,使用Kafka Connect或任何其他生产者)写入到Kafka主题中的数据-使用Schema Registry,您可以轻松地检索架构。没有它,您就开始将微服务开发与必须知道在何处生成源数据及其模式相关联。
这里有一个关于这个主题的好话:https://qconnewyork.com/system/files/presentation-slides/qcon_17_-_schemas_and_apis.pdf
答案 1 :(得分:0)
他们需要吗?不,不是。
您是否应该在主题上节省一些空间,并且不发送作为消息的一部分,还是要求使用者让该模式读取任何内容?是的,这就是AvroSerializer为您所做的-将可简化为REST API消费的数据外部化。
然后,解串器必须知道如何获取该架构,并且可以使用specific.avro.reader=true
属性对其进行配置,而不必亲自手动调用fromByteBuffer
,让AvroDeserializer对其进行处理。
此外,在大型组织中,改组单个user.avsc
文件(即使受版本控制)也无法控制该副本随着时间的推移而变得陈旧或无法以一种干净的方式处理演变。
答案 2 :(得分:0)
模式注册表最重要的功能之一就是管理模式的演变。它提供了兼容性检查层。通过设置适当的兼容性类型,您可以确定允许的架构更改。
您可以找到所有可用的兼容性类型here。