Мне нужно отправить сообщение в Kafka, но это сообщение должно контролироваться двумя схемами Avro. Действительно, две разные команды в организации будут управлять развитием двух схем в реестре схем. .
Например, мое сообщение содержит информацию о личности пользователя и настроении пользователя при отправке сообщения. Первая схема контролирует часть сообщения об идентификаторе пользователя, вторая схема контролирует текущее настроение пользователя.
Существует группа идентификации, которая контролирует идентификацию пользователя и может принять решение добавить или удалить поля о идентичность. Существует команда User Mood, которая интересуется настроением пользователя и может решить добавить или удалить поля о настроении пользователя.
Только администраторы могут развивать схемы. Производители и потребители могут только читать и использовать схемы для сериализации / десериализации.
Предположим, мои первые схемы:
{
"name": "SchemaIdentity",
"type": "record",
"namespace": "my.company.namespace.identity",
"fields": [
{
"name": "username",
"type": "string"
},
{
"name": "name",
"type": "string"
},
{
"name": "surname",
"type": "string"
}
]
}
Моя вторая схема:
{
"name": "SchemaMood",
"type": "record",
"namespace": "my.company.namespace.mood",
"fields": [
{
"name": "current_mood",
"type": "string"
}
]
}
Сообщение, отправляемое Кафке, должно быть двоичным и содержать следующую информацию:
{
"username":"johndoe001",
"name":"john",
"surname":"doe",
"mood": [
{ "current_mood":"happy" }
]
}
Как вы думаете, что является наилучшей практикой или выполнимо для этого варианта использования? Вы видите третью возможность?
Основными задачами для меня, чтобы рассмотреть, являются:
- , чтобы сделать (де) сериализацию более легкой на стороне производителя и потребителя.
- , чтобы можно было легко и легко развивать две схемы в реестре схем.
Возможность 1
Вложить 2-ю схему в первую в виде байтового массива. Основная схема будет такой, как показано ниже (с настроением в качестве сериализованных данных на карте байтов other_infos). В этом случае, когда производитель хочет отправить сообщение, он должен сначала сериализовать информацию о настроении со схемой настроения, а затем всю информацию (идентичность + настроение) с основной схемой.
{
"name": "MainSchema",
"type": "record",
"namespace": "my.company.namespace.identity",
"fields": [
{
"name": "username",
"type": "string"
},
{
"name": "name",
"type": "string"
},
{
"name": "surname",
"type": "string"
},
{
"name": "other_infos",
"type": "map",
"values": "bytes"
}
]
}
Возможность 2
Объедините две схемы в одну. Но как ? На каком этапе? Как управлять развитием объединенной схемы?
Другие возможности?