【发布时间】: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<T> 类实现了这个接口,并且正在发布的有效负载T 被包装在Event<T> 信封中。
Event.cs
public class Event<T>
{
// Some other properties
public T Payload { get; set; }
}
我的组件的初始实现不使用 Avro 序列化程序或架构注册表。它使用Newtonsoft.Json 将Event<T> 序列化为JSON,并将字符串生成到Kafka 主题。这样做的好处是有效负载实际上可以是任何对象。主题名称是对象的完全限定类名称,因此主题保证是同质的。缺点是有效载荷对 Kafka 是不透明的。
我现在正致力于从 Newtonsoft.Json 转换为 Avro 和 Schema Registry。这似乎表明我的模型不再是字面上的任何东西。必须专门编写它们以通过实现ISpecificRecord 接口来允许 Avro 序列化。如果这是真的,那并不理想,但我可以忍受。
我似乎无法弄清楚的问题是如何将Event<T> 信封合并到 Avro 架构中。有没有办法将一个模式嵌套在另一个模式中?我所有的具体模式是否也应该定义Event<T> 信封?改用GenericRecord 并尝试在运行时使用反射自动生成架构,这样我的组件就可以返回接受字面上的任何对象作为有效负载是明智的吗?
【问题讨论】:
标签: c# .net apache-kafka avro confluent-platform