В последнее время в социальных сетях активно обсуждались контракты о передаче данных. Некоторые дата-саентисты делились мнениями о плюсах и минусах этого новшества и о том, что это вообще такое.

Это малоизученная тема, но я хотел бы поделиться своим опытом и конструктивными советами о том, как начать работу в этом направлении. Контракты о передаче данных  —  это нечто реальное и ценное, что можно использовать уже сегодня, прилагая меньше усилий, чем кажется.

Что особенного в контрактах о передаче данных

Если вы работаете с данными, скорее всего, вам не раз придется столкнуться с такой ситуацией: данные неверны, и вы не можете установить причину. Кажется, что на начальном этапе сбора данных есть проблема, но никто из коллег не знает, почему она возникла. Что же делать и к кому обратиться?

Поскольку качество предоставляемых данных не всегда безупречно, команды дата-саентистов начинают анализировать существующую инфраструктуру, которая служит другим первоначальным целям. Они “подключают” конвейеры к актуальной оперативной базе данных, выгружают данные в хранилище и выполняют дальнейшие действия.

Изображение автора

Команды по работе с данными оказываются между двух огней  —  оперативными базами данных, которые они не могут контролировать, и жестко поставленными бизнес-целями.

Немного “поколдовав”, дата-саентисты пытаются что-то исправить, но принцип “мусор на входе  —  мусор и на выходе” действует безотказно. Чем больше проблем во входящем потоке данных, тем сложнее командам по работе с ним.

Именно в такой ситуации может прийти на помощь контракт о передаче данных. Он позволяет команде дата-саентистов четко сформулировать свои условия и договориться о более строгом процессе управления изменениями.

Как реализуются такие контракты

Поначалу это кажется нереальным, поскольку редко есть возможность начать работу с инфраструктуры, созданной с нуля. Однако с сегодняшними облачными технологиями это выполнимо.

Событийно-ориентированная архитектура способна оказать поддержку контрактам о передаче данных по нескольким причинам.

  • События могут быть сильно типизированы, и каждое из них может быть связано с версией схемы.
  • Это дешево, если вы используете бессерверный поток событий, а инфраструктура  —  автономна (в каждом отдельном случае).
  • Платформы событий (они же pub/sub) предлагают встроенные коннекторы для потребления классических нисходящих данных (хранилище объектов, хранилище данных).

Такие технологии, как AWS Kinesis и Kafka (с управляемым Kafka, например, AWS MSK и Confluent), Cloud Pub/Sub  —  хорошие варианты для начала работы.

Идея заключается в том, чтобы создать качественно новый контракт с бэкенд-разработчиками, основанный на важнейших целях потребителей (данных).

Бэкенд-специалисты часто располагают опытом работы с шаблонами, управляемыми событиями, не затрагивающим аналитику. Например, взаимодействие между микросервисами. Здесь возможны два варианта.

  1. Достичь компромисса в отношении схемы, чтобы она подходила как для аналитики данных, так и для конкретного сценария использования.
  2. Создать событие, предназначенное для использования в области аналитики данных.

Выбор варианта 1 позволит избежать взрывного роста типа событий, создаваемых у источника, но, возможно, усложнит ход обсуждения изменений, поскольку в процесс будет вовлечено больше заинтересованных сторон.

Изображение автора

Определение создания/изменения контракта

Большинство платформ потоковой обработки событий, таких как Kafka и AWS MSK, имеют свой реестр схем (реестр AWS Glue в случае AWS). Для каждой создаваемой темы необходимо регистрировать схему.

Простым способом реализации такого процесса между производителем и потребителем данных является повторное использование процесса git.

Изображение автора

Весь процесс создания, изменения и удаления схемы может проходить через пул-реквест git. Имея четкое представление о собственнике и потребителе темы, вы всегда будете знать, кто может утверждать изменения в схеме. При слиянии конвейер CI/CD подхватывает и развертывает изменение с соответствующей схемой.

Прелесть такого процесса в том, что он обязывает обсуждать изменения до их внесения.

Производственный чек-лист

Вот несколько моментов, которые можно порекомендовать при реализации контрактов о передаче данных с шиной событий.

Используйте типизированную схему

Поддерживать схему JSON довольно проблематично. Слишком много свободы действий. Общим стандартом для типизированных событий является использование Avro. Он поддерживается всеми реестрами схем и имеет много возможностей взаимодействия с другими механизмами обработки (Flink, Spark и т. д.) для дальнейшего преобразования.

Не зацикливайтесь на вложенных полях

Поскольку мы обычно анализируем данные в столбцовом формате, наличие слишком большого количества вложенных сложных полей может быть проблемой для развития схемы, которая еще и скажется на стоимости обработки. Если у вас много вложенных полей, подумайте о разделении события на несколько с определенными схемами.

Иногда допускайте компромисс в отношении вложенных полей

Если производитель не уверен в определении всех схем (например, они зависят от API сторонних производителей), можно оставить остальную часть unknown в виде строки JSON. Это потребует больше затрат на вычисления для получения доступа к такому полю, но оставит больше возможностей для гибкости на стороне производителя данных.

Настройте дополнительные поля метаданных в событии

Такие элементы, как owner, domain, team_channel и идентификация столбцов PII определенными полями, будут полезны в дальнейшем для четкого определения прав собственности, адресной области и управления доступом.

Schemata  —  полезный ресурс, в котором также можно черпать вдохновение для моделирования схем событий.

Не меняйте тип данных для указанного поля

Лучше переименовать поле в новый тип. Хотя можно воспользоваться механизмом для обнаружения версии схемы в нисходящем потоке данных, разрешение изменения типа поля без его переименования всегда будет вызывать головную боль. Выполнив это в одном случае, вы будете вынуждены обрабатывать все остальные. Так, если изменение int нa string не причинит проблем, то что произойдет, если изменить int на float или float на int?

Реализуйте контракты о передаче данных без шины событий при возможности

Если есть место в git, где хранятся все DDL-запросы для оперативной базы данных, можно реализовать большинство из вышеперечисленного. Например, при любом изменении, внесенном в базу данных, git-процесс будет извещать потребителя, которому необходимо утвердить изменение. Однако это достаточно сложно, поскольку вы заключали контракт о передаче уже существующих данных, и у команды дата-саентистов не было возможности высказаться при создании схемы.

Право собственности  —  производителю данных

Контракты о передаче данных  —  это возможность отдать право собственности производителям данных, а не заставлять команды дата-саентистов страдать от непроверенных данных, которые им предоставляют. Это позволяет устранить изолированность продуктов и данных.

Самая большая проблема  —  организационная. Команды по работе с данными должны преодолеть барьер и обсуждать новые процессы с бэкенд-разработчиками, а это не всем дается легко. Выделение текущих болевых точек и обеспечение видимости того, как потребляются данные,  —  действенные стимулы для такого обсуждения.

Что касается инструментария, то все можно настроить постепенно, используя сервис pub/sub платформы событий, реестр схем и git в процессе заключения контрактов о передаче данных.

Нет необходимости сразу приступать к глобальной реорганизации  —  начните с малого и постепенно двигайтесь по пути освоения нового паттерна!

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи mehdio: Data Contracts — From Zero To Hero

Предыдущая статьяВозможности и перспективы WebAssembly
Следующая статьяКак освоить машинное обучение