我正在开发一个使用Kafka和合流.NET客户端的.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; }
}my组件的初始实现不使用Avro序列化程序或架构注册表。它使用Event<T>将Newtonsoft.Json序列化为JSON,并生成一个卡夫卡主题的字符串。这样做的好处是,有效载荷可以是任何对象。主题名称是对象的完全限定类名,因此保证主题是同构的。缺点是对卡夫卡来说,有效载荷是不透明的。
我现在正致力于将Newtonsoft.Json转换为Avro和架构注册表。这似乎表明我的模特不可能再做任何事了。必须专门编写它们,以便通过实现ISpecificRecord接口来实现Avro序列化。如果这是真的,那是不理想的,但我可以接受。
我似乎无法理解的问题是如何将Event<T>信封集成到Avro模式中。有没有一种方法可以在另一个模式中嵌套模式?我的所有具体模式是否也应该定义Event<T>信封?改用GenericRecord并尝试使用反射在运行时自动生成模式,这样我的组件就可以返回到接受任何对象作为有效负载吗?
发布于 2021-07-22 13:16:01
也许有一种更优雅的方法,但是在每个模式中都包含正确的东西应该可以做到这一点。也许您希望以编程的方式这样做,以确保一致性。
通常,一切正常工作,除非您发现自己试图检查每条消息,并为每个单独的消息定义模式。这可能是可能的,但肯定是不可取的。
https://stackoverflow.com/questions/56118965
复制相似问题