Как вы сказали, общий подход к созданию журналов аудита - это библиотеки на стороне приложения, такие как envers или Javers. Эти файлы подключаются в постоянную библиотеку, они будут поддерживать определенные c столбцы в таблицах данных ("createBy", "lastUpdated" и c.) И / или копировать более ранние версии записей в какую-либо форму. таблиц истории.
Однако есть некоторые недостатки:
запись записей в таблицы истории в рамках транзакций OLTP увеличивает число выполняемых операторов в транзакции -> может привести к увеличению времени ответа приложения
поддержка массовых обновлений и удаление
изменения, сделанные непосредственно в базе данных, не могут быть отслежены
Изменение захвата данных за 3 шага
- Изменение данных захвата
- Преобразование данных изменений в формат, поддерживаемый вашей целевой базой данных для загрузки
- Загрузка данных в базу данных назначения.
Изменение сбора данных с помощью триггеров базы данных
Другой метод - триггеры базы данных. Они не пропустят никаких операций, независимо от того, были ли они выпущены из приложения или из самой базы данных. Массовая выписка тоже будет обработана. Еще одно преимущество CD C на основе триггера состоит в том, что приложение не знает о том, что вы добавили весь уровень аудита. С другой стороны, существует проблема увеличения задержки при выполнении триггеров в рамках транзакций OLTP.
Альтернативное решение для триггеров (Postgresql здесь): используйте логическую репликацию для потоковой передачи изменений базы данных (декодированные сообщения WAL) с MASTER-сервера на SLAVE-сервер с использованием WAL и включения триггера Audit для захвата изменений в реплицированных таблицах на подчиненный сервер.
Изменение сбора данных с помощью подхода на основе журнала
Вышеупомянутых проблем не существует при использовании transaction log
в качестве источника для аудита и использовании сбора данных изменений для получение информации об изменениях и отправка ее в брокер сообщений или постоянный журнал, например, Apache Kafka
. Обычно считается лучшим подходом к изменению сбора данных, но не самым простым решением для установки.
При асинхронном запуске процесс CD C может извлекать данные изменений, не влияя на транзакции OLTP.
Всякий раз, когда происходит изменение данных, в журнал транзакций добавляется запись.
Для каждой записи будет обновляться или удаляться запись в массовой операции, поэтому событие изменения для каждого из них могут быть получены.
Остается вопрос о том, как CD C может получить доступ к метаданным, как пользователь приложения, который выполнил изменение данных, свой IP-адрес, идентификатор диапазона трассировки или любой вид correlationID.
Один из подходов - создать отдельную таблицу, в которой хранятся эти метаданные. Приложение может хранить для каждой транзакции запись внутри этой таблицы с указанием c transactionId
. События изменения данных будут содержать идентификатор транзакции, связанный с изменением, поэтому события изменения данных и записи метаданных могут быть соотнесены.