如何在C#中为泛型类型创建Avro模式?

时间:2019-05-13 19:46:30

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

我正在使用Kafka和Confluent's .NET client开发.NET标准发布/订阅包。我的生产者具有以下界面。

IEventPublisher.cs

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

我的KafkaEventPublisher<T>类实现了此接口,发布的有效载荷T被包裹在Event<T>信封中。

Event.cs

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

    public T Payload { get; set; }
}

我组件的初始实现未使用Avro序列化器或架构注册表。它使用Event<T>Newtonsoft.Json序列化为JSON,并将该字符串生成一个Kafka主题。有利的一面是,有效载荷实际上可以是任何对象。主题名称是对象的完全限定的类名称,因此可以保证主题是同质的。缺点是有效载荷对Kafka不透明。

我现在正在从Newtonsoft.Json转换为Avro和Schema Registry。这似乎表明我的模型实际上已不再是什么。必须专门编写它们,以通过实现ISpecificRecord接口来允许Avro序列化。如果这是真的,那不是理想的选择,但我可以接受。

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

1 个答案:

答案 0 :(得分:0)

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

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