Как создать схемы Avro для универсального типа в C #? - PullRequest
2 голосов
/ 13 мая 2019

Я работаю над созданием пакета .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 вместо этого и попытаться автоматически сгенерировать схему во время выполнения, используя отражение, чтобы мой компонент мог вернуться к буквальному принятию любого объекта в качестве полезной нагрузки?

...