【问题标题】:Avro schema GenericRecord missing keyAvro 架构 GenericRecord 缺少键
【发布时间】:2020-03-17 01:42:07
【问题描述】:

我正在使用 Avro 架构,使用 Confluent Kafka 客户端从 C# 应用程序动态生成消息到 Kafka 集群。编译时不知道数据类型,因此我使用来自Avro.Generic 命名空间的 GenericRecord 类,如下所述:https://www.confluent.io/blog/decoupling-systems-with-apache-kafka-schema-registry-and-avro/

但是我有一个问题 - 如果架构有一个可以包含 null 值的字段,仍然需要使用 Add 方法将该字段添加到 GenericRecord,并将 null 作为值。我的应用程序不知道可以为空的字段,我认为不应该是 - 因为这会违背架构中可空字段的目的。

Avro 架构:

{
  "namespace": "Test",
  "type": "record",
  "doc": "Test bool type",
  "name": "BoolType",
  "version": "1",
  "fields": [
    {
      "name": "Data",
      "type": [ "null", "boolean" ],
      "default": null
    },
    {
      "name": "Source",
      "type": "string"
    }
  ]
}

C#代码:

var valueRecord = new GenericRecord( valueAvroSchema );
valueRecord.Add( "Data", null );
valueRecord.Add( "Source", "Test app .NET" );

var messageToSend = new Message<GenericRecord, GenericRecord>
{
   Key = keyRecord,
   Value = valueRecord
};

await _producer.ProduceAsync( _topicName, messageToSend );

如果行:

valueRecord.Add( "Data", null );

不存在,ProduceAsync 方法会抛出 Confluent.Kafka.ProduceException,如下面的屏幕截图所示。

有什么方法可以自动填充 GenericRecord 中可以为空的字段?如果我必须用它们的默认值填充字段,这同样适用。

是否有任何方法可以以标准方式执行此操作,或者我是否需要编写自己的代码来读取架构,以及是否有任何我的应用程序尚未设置的可空字段在最后添加它们,之前出版?

谢谢!

【问题讨论】:

    标签: c# apache-kafka schema avro confluent-platform


    【解决方案1】:

    Avro 默认值仅与消费者相关。生产者必须始终设置每个字段

    【讨论】:

    • 一般来说,可为空的布尔值总是令人困惑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2012-03-26
    • 1970-01-01
    • 2017-03-04
    • 2021-07-22
    • 1970-01-01
    • 2017-02-06
    相关资源
    最近更新 更多