我正在使用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
并尝试在运行时使用反射自动生成架构,这样我的组件可以返回接受字面上的任何对象作为有效载荷,这会明智吗?
答案 0 :(得分:0)
也许有一种更优雅的方式,但在每个模式中包含正确的东西应该可以解决问题。也许您想以编程方式执行此操作以确保一致性。
一般来说,一切正常,除非您发现自己试图检查每条消息并为每条消息定义架构。这可能是可能的,但肯定不是高性能/可取的。