Avro: Как сделать сообщение управляемым двумя схемами Avro? - PullRequest
0 голосов
/ 06 января 2020

Мне нужно отправить сообщение в 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

Объедините две схемы в одну. Но как ? На каком этапе? Как управлять развитием объединенной схемы?

Другие возможности?

...