Я работаю над созданием пакета .NET Standard pub / sub с использованием Kafka и клиента Confluent .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>
в JSON с использованием Newtonsoft.Json
и создает строку для темы Kafka. Положительным моментом является то, что полезной нагрузкой может быть буквально любой объект. Имя темы - это полное имя класса объекта, поэтому тема гарантированно будет однородной. Недостатком является то, что полезные данные непрозрачны для Кафки.
Сейчас я работаю над преобразованием из Newtonsoft.Json
в Avro и реестр схем. Кажется, это говорит о том, что мои модели больше не могут быть буквально ничем. Они должны быть специально написаны для обеспечения возможности сериализации Avro путем реализации интерфейса ISpecificRecord
. Если это правда, это не идеально, но я могу жить с этим.
Проблема, которую я не могу понять, заключается в том, как включить конверт Event<T>
в схемы Avro. Есть ли способ вложить схему в другую схему? Должны ли все мои конкретные схемы также определять конверт Event<T>
? Было бы разумно использовать GenericRecord
вместо этого и попытаться автоматически сгенерировать схему во время выполнения, используя отражение, чтобы мой компонент мог вернуться к буквальному принятию любого объекта в качестве полезной нагрузки?