Считается ли источник событий с использованием базы данных CDC хорошей архитектурой? - PullRequest
0 голосов
/ 26 января 2019

Когда мы говорим о событиях сорсинга, мы имеем простую архитектуру двойной записи, в которой мы можем записывать в базу данных, а затем записывать события в очередь, подобную Кафке. Другая нижестоящая система может читать эти события и действовать соответственно / использовать их.

Но проблема возникает при попытке синхронизировать как БД, так и События, так как для этого необходимо упорядочить эти события.

Чтобы решить эту проблему, люди, поощряющие использовать журналы фиксации базы данных в качестве источника событий, и есть инструменты, построенные вокруг этого, такие как Spinal Tap от Airbnb, Debezium от Redhat, Золотые ворота Oracle и т. Д. Это решает проблему согласованности, упорядочения гарантии и все это.

Но проблема использования журнала фиксации базы данных в качестве источника событий заключается в том, что мы тесно связаны со схемой БД. Схемы БД для микросервиса раскрыты, и любые критические изменения в схеме БД, такие как изменение типа данных / изменение имени столбца, могут фактически сломать последующие системы.

Так что использование DB CDC в качестве источника событий - хорошая идея?

Разговор об этой проблеме и использовании дебезия для поиска событий

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Расширение ответа Константина:

TLDR;

Хвост / майнинг журнала транзакций должен быть скрыт от других.

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

  1. Служба A фиксирует транзакцию в БД
  2. Платформа или служба опрашивает журнал фиксации и отображает новые коммиты в Kafka как события
  3. Служба B подписана на поток Kafka и получает события оттуда, а не из БД

Более длинная история:

Служба B не видитчто ваше событие происходит из БД и не имеет прямого доступа к БД.Данные фиксации должны быть спроецированы в событие.Если вы изменяете БД, вам следует только изменить свое правило проекции, чтобы сопоставить коммиты в новой схеме со «старым» форматом событий, поэтому нельзя менять потребителей.(Я не знаком с Debezium, и может ли он делать эту проекцию).

Ваши события должны быть идемпотентными, так как публикация события и фиксация транзакции атомарно - это проблема в распределенном сценарии, и инструменты гарантируют- по крайней мере один раз с семантикой обработки ровно один раз, а часть с одним разом встречается реже.Это связано с тем, что источник события (журнал транзакций) не совпадает с потоком, к которому будут обращаться другие сервисы, то есть он распространяется.И это все еще часть производителя, та же проблема существует с Kafka-> потребительским каналом, но по другой причине.Кроме того, Кафка не будет вести себя как хранилище событий , поэтому вы достигли очереди сообщений.

Я рекомендую вместо этого использовать выделенное хранилище событий, если это возможно, как у Грега Янга: https://eventstore.org/. Это решает проблему путем интеграции хранилища событий и брокера сообщений в единое решение.Сохраняя событие (в JSON) в потоке, вы также «публикуете» его, так как потребители подписаны на этот поток.Если вы хотите дополнительно разделить сервисы, вы можете написать прогнозы, которые отображают события из одного потока в другой поток.Использование этого события также должно быть идемпотентным, но вы получите хранилище событий, которое разделено на агрегаты и довольно быстро читается.

Если вы тоже хотите сохранить данные в БД SQL, прослушайте эти события и вставьте / обновите таблицы на их основе, просто не используйте свою БД SQL в качестве хранилища событий, потому что это будет сложноправильно реализовать (безошибочное).

Для упорядочивания: упорядочить чтение событий из одного потока.Прогнозы, которые объединяют несколько потоков событий, могут гарантировать только упорядочение между событиями, происходящими из одного потока.Обычно этого более чем достаточно.(кстати, вы можете при необходимости переупорядочить сообщения на основе некоторого поля на стороне потребителя.)

0 голосов
/ 26 января 2019

Если вы используете источник событий:

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

Если вы не используете источник событий:

В этом случае существует связь между внутренней структурой Агрегатов и компонентом CDC (которая фиксирует изменение данных и публикует событие в очереди сообщений или аналогичной).Чтобы ограничить влияние этой связи на сам микросервис, компонент CDC должен быть его частью.Таким образом, когда внутренняя структура Агрегатов в Микросервисе изменяется, компонент CDC также изменяется, и внешний мир не замечает.Оба изменения развернуты одновременно.

...