【问题标题】:How to create Avro schemas for a generic type in C#?如何在 C# 中为泛型类型创建 Avro 模式?
【发布时间】:2019-09-30 19:18:49
【问题描述】:

我正在使用 Kafka 和 Confluent's .NET client 开发一个 .NET Standard 发布/订阅包。我的制作人有以下界面。

IEventPublisher.cs

public interface IEventPublisher<T>
{
    bool Publish(Event<T> evnt);
}

我的KafkaEventPublisher&lt;T&gt; 类实现了这个接口,并且正在发布的有效负载T 被包装在Event&lt;T&gt; 信封中。

Event.cs

public class Event<T>
{
    // Some other properties 

    public T Payload { get; set; }
}

我的组件的初始实现不使用 Avro 序列化程序或架构注册表。它使用Newtonsoft.JsonEvent&lt;T&gt; 序列化为JSON,并将字符串生成到Kafka 主题。这样做的好处是有效负载实际上可以是任何对象。主题名称是对象的完全限定类名称,因此主题保证是同质的。缺点是有效载荷对 Kafka 是不透明的。

我现在正致力于从 Newtonsoft.Json 转换为 Avro 和 Schema Registry。这似乎表明我的模型不再是字面上的任何东西。必须专门编写它们以通过实现ISpecificRecord 接口来允许 Avro 序列化。如果这是真的,那并不理想,但我可以忍受。

我似乎无法弄清楚的问题是如何将Event&lt;T&gt; 信封合并到 Avro 架构中。有没有办法将一个模式嵌套在另一个模式中?我所有的具体模式是否也应该定义Event&lt;T&gt; 信封?改用GenericRecord 并尝试在运行时使用反射自动生成架构,这样我的组件就可以返回接受字面上的任何对象作为有效负载是明智的吗?

【问题讨论】:

    标签: c# .net apache-kafka avro confluent-platform


    【解决方案1】:

    也许有一种更优雅的方法,但在每个模式中包含正确的东西应该可以解决问题。也许您想以编程方式执行此操作以确保一致性。

    一般来说,一切正常的事情可能都很好,除非您发现自己试图检查每条消息并为每条单独的消息定义架构。这可能是可能的,但肯定不会是高性能/可取的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多