Предотвращение циклов обновления для нескольких баз данных с помощью CDC - PullRequest
0 голосов
/ 23 марта 2012

У нас есть ряд устаревших систем, в которые мы не можем вносить изменения - однако мы хотим начать принимать изменения данных из этих систем и автоматически применять их в других системах.

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

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

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

Есть идеи?

1 Ответ

2 голосов
/ 30 марта 2012

Если я правильно понимаю ваш вопрос, вы пытаетесь определить структуру маршрутизации сообщений, которая работает с уже выбранным дизайном (с использованием служебной шины предприятия ) и реализацией сообщений., который вы можете использовать для передачи данных с устаревших систем, которые only forward-ports изменяют на более новые системы.

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

Секрет в том, как какФункции CDC MSSQL согласовывают изменения по мере их распространения по сети.В частности, обратите внимание на следующее предупреждение:

Все изменения регистрируются в терминах LSN или регистрационного порядкового номера.SQL четко идентифицирует каждую операцию DML через порядковый номер журнала.Любые зафиксированные изменения в любых таблицах записываются в журнал транзакций базы данных с определенным номером LSN, предоставленным SQL Server.Значения __ $ operationcolumn: 1 = удалить, 2 = вставить, 3 = обновить (значения до обновления), 4 = обновить (значения после обновления).

cdc.fn_cdc_get_net_changes_dbo_Employee дает нам все записи, которые изменились в сети, упалимежду LSN мы предоставляем в функции.У нас есть три записи, возвращаемые функцией net_change;Произошло удаление, вставка и два обновления, но в одной записи.В случае обновленной записи просто отображается чистое измененное значение после завершения обоих обновлений.

Для получения всех изменений выполните cdc.fn_cdc_get_all_changes_dbo_Employee;Есть варианты, чтобы передать 'ALL' или 'ALL UPDATE OLD'.Опция «ALL» предоставляет все изменения, но для обновлений она предоставляет после обновленные значения.Отсюда мы находим две записи для обновлений.У нас есть одна запись, показывающая первое обновление, когда Джейсон был обновлен до Nichole, и одна запись, когда Nichole был обновлен до EMMA.

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

Обратите также внимание:

CDC по умолчанию отключен и должен быть включенна уровне базы данных с последующим включением в таблицу.

Вариант B становится очевидным: установите CDC в устаревших системах, затем используйте служебную шину для преобразования этих изменений в обновления, которые не связаныCDC (используя, например, необработанные операторы обновления транзакций).Это должно обеспечить односторонний поток данных, которые вы запрашиваете при проектировании вашей системы.

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

...