Дебезиум с шаблоном исходящих сообщений
Установка контекста:
- Использование
- Мы хотели использовать реестр схем для хранения всех схем событий для различных бизнес-объектов
- В одной теме может быть несколько версий одной и той же схемы
- В одной теме может быть совершенно другая схема, ограниченная бизнес-контекстом. Ex customerCreated, customerPhoneUpdated, customerAddressUpdated. (Используя одно имя субъекта strtegies)
- Требуется проверить, поддерживает ли debezium пункты 2 и 3 (особенно 3).
Представьте, у меня есть два бизнес-события customerCreated и orderCreated и яхотел сохранить их в одной теме «com.business.event».
customerCreated
{«id»: «244444» «name»: «test», «address»: «test123 »,« электронная почта »:« test@test.com »}
orderCreated
{« id »:« 244444 »« value »:« 1234 »,« address »:« test123 »,« телефон »:« 3333 »,« дата доставки »:« 10-12-19 »}
Структура моей таблицы исходящих сообщений соответствует следующей статье
https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/
Колонка |Тип |Модификаторы -------------- + ------------------------ + ---------- идентификатор |UUID |не нулевой агрегатный тип |изменение характера (255) |не нулевой агрегатид |изменение характера (255) |не нулевой тип |изменение характера (255) |не нулевая полезная нагрузка |JSONB |not null
Теперь, когда я помещаю свое бизнес-событие в таблицу выше, оно будет сохранять события customerCreated и orderCreated в столбце полезной нагрузки в виде String / JSON. Если я отправлю это на kafka в теме «com.business.event» с использованием коннектора debezium, то появится следующее сообщение. (Печать со схемой, например)
customerCreated.json
{
"schema":
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"eventType"
},
{
"type":"string",
"optional":false,
"name":"io.debezium.data.Json",
"version":1,
"field":"payload"
}
],
"optional":false
},
"payload":
{
"eventType":"Customer Created",
"payload":"{\"id\": \"2971baea-e5a0-46cb-b1b1-273eaf88246a\", \"name\": \"jitender\", \"email\": \"test\", \"address\": \"700 \"}}"
}
}
orderCreated.json
{
"schema":
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"eventType"
},
{
"type":"string",
"optional":false,
"name":"io.debezium.data.Json",
"version":1,
"field":"payload"
}
],
"optional":false
},
"payload":
{
"eventType":"Order Created",
"payload":"{\"id\": \"2971baea-e5a0-46cb-b1b1-273eaf88246a\", \"value\": \"123\",\"deliverydate\": \"10-12-19\", \"address\": \"test\", \"phone\": \"700 \"}}"
}
}
Проблема:
Как видно из приведенных выше примеров, схема в реестре схем / kafka остается неизменной, хотя полезная нагрузка содержит различные бизнес-объекты. Теперь, когда я, как потребитель, иду и пытаюсь десериализовать это сообщение, я должен знать, что полезная нагрузка может содержать различную структуру в зависимости от бизнес-события, из которого они сгенерированы. В этом сценарии я не могу в полной мере использовать реестр схем, поскольку потребитель должен заранее знать все бизнес-объекты.
Вопросы:
- Что я хотел сделать, так это то, что дебезиум долженсоздайте две разные схемы под одной и той же темой «com.business.event», используя стратегию имени субъекта (пример ниже). https://karengryg.io/2018/08/18/multi-schemas-in-one-kafka-topic/
Теперь, когда я потребляю сообщение, мой потребитель прочитает идентификатор схемы из сообщения темы и получит его из реестра схемы и расшифрует сообщение непосредственно вместе с ним. После декодирования я могу игнорировать сообщение, если меня не интересует деловое мероприятие. Делая это, я могу иметь разные схемы в той же теме, используя реестр схемы.
Можно ли управлять схемой в теме кафки, когда я использую дебезиум в сочетании с реестром схемы. Таблица исходящих или шаблон исходящих сообщений является обязательным.