Асинхронный аудит с помощью JaVers

Мне нужно проверить изменения в некоторых объектах в нашем приложении, и я думаю об использовании JaVers. Мне нравится поддержка опроса данных аудита, предоставляемая JaVers. Hibernate Envers выглядит хорошо, но хранит данные в той же БД.

Вот мои требования:

  • асинхронное ведение журнала — для минимального влияния на производительность
  • хранить данные аудита в другом db - также причины производительности

Насколько я вижу, JaVers не предназначен для вышеперечисленного, но, похоже, его можно адаптировать для достижения вышеперечисленного. Вот как:

  • JaVers фактически позволяет хранить данные в другой БД. Вы действительно можете обеспечить подключение к любой БД. Это не так, как это задумано, но это работает. Код ниже (обратите внимание на connectionProvider, который может обеспечить подключение к любой БД):

'

final Connection dbConnection =
            DriverManager.getConnection("jdbc:mysql://localhost:3306/javers", "root", "root");

ConnectionProvider connectionProvider = new ConnectionProvider() {
    @Override
    public Connection getConnection() {
        //suitable only for testing!
        return dbConnection;
    }
};
JaversSqlRepository sqlRepository = SqlRepositoryBuilder
            .sqlRepository()
            .withConnectionProvider(connectionProvider)
            .withDialect(DialectName.MYSQL).build();
  • The async can be achieved by moving the execution of the JaVers commit into a thread/executor. The challenge with that is that if the execution takes too long, it could be that the object changes before it's logged. There are 2 solutions I can think of here:
    • we could create a snapshot of the object (e.g. serialize it to JSON or the like) and pass that to a Thread to log it.
    • мы предоставляем собственную реализацию репозитория Javers, которая обрабатывает различия в текущем потоке, а затем передает объекты Snapshot для сохранения в другом потоке. Таким образом, мы будем выполнять только чтение из БД в потоке приложения и запись (что, как правило, более затратно с точки зрения производительности) в потоке аудита.

ВОПРОСЫ:

  • я что-то пропустил здесь? Может ли это работать?
  • Есть ли у JaVers поддержка создания моментального снимка объекта, который затем можно переместить в другой поток. Он делает это где-то внутри, так что, возможно, это то, что мы могли бы использовать.

ПРОСТО К СВЕДЕНИЮ: Не имеет отношения к вопросу, но вот некоторые другие проблемы, которые я могу придумать, и то, как я планирую их решить:

  • из-за отсутствия аудита в той же транзакции, как если бы транзакция завершилась неудачей, это усложнило бы откат аудита. Поэтому нам нужно проверять только те объекты, которые были успешно зафиксированы. Я намерен сделать это, используя Hibernate Interceptor, прослушивая afterTransactionCompletion и фиксируя только объекты, обновленные этой транзакцией.
  • В случае лениво загруженных объектов я мог видеть, как, если мы пытаемся получить к ним доступ после завершения транзакции, может случиться так, что лениво загруженные реквизиты не могут быть доступны (поскольку сеанс также может быть закрыт) - don не знаю, как это исправить, но это может не быть проблемой, так как я думаю, что мы загружаем большинство нетерпеливых реквизитов.

person Stef    schedule 12.10.2017    source источник
comment
Асинхронная фиксация выпущена в версии 3.12.0.   -  person Charlie    schedule 03.12.2018


Ответы (1)


Интересный вопрос. Сначала слабоумие. Все основные модули JaVers предназначены для отделения данных аудита от данных приложения. Как вы упомянули, пользователь предоставляет ConnectionProvider для использования JaVers. Это может быть любая база данных, которую вы хотите.

Что не предназначено для использования с несколькими БД, так это модули интеграции Spring для SQL, поэтому javers-spring-jpa и javers-spring-boot-starter-sql. Они просто охватывают наиболее распространенный сценарий, поэтому одна и та же БД для приложения и JaVers.

Вы правы насчет отсутствия асинхронной фиксации. К счастью, это можно реализовать только в JaversCore без изменения репозиториев.

API может быть:

CompletableFuture<Commit> javers.commitAsync(..., Executor);

Во-первых, Javers сделает снимок объектов пользователя, это быстро, поэтому это можно сделать в текущем потоке.

Затем чтение БД (загрузка последних моментальных снимков) и запись БД (вставка новых снимков) могут выполняться асинхронно (отправляясь данному исполнителю).

Как вы упомянули, для этого требуется новый подход к транзакциям БД. Мы планируем реализовать функцию Отмена фиксации, чтобы приложение могло отозвать фиксацию JaVers после отката основной базы данных. См. https://github.com/javers/javers/issues/588.

person Bartek Walacik    schedule 13.10.2017
comment
Спасибо, это звучит здорово. Чтобы сделать его более интересным, мы также используем Java 7 и сомневаемся, что сможем измениться слишком быстро (это довольно сложное приложение, которому более 10 лет, поэтому изменения происходят очень медленно). Возможно ли иметь это изменение в предыдущей версии? Кроме того, вы действительно планируете добавить поддержку асинхронности? - person Stef; 14.10.2017
comment
Я был бы рад перенести код на более старую версию JaVers, как только он будет доступен в последней версии. - person Stef; 14.10.2017
comment
Мы не собираемся разрабатывать JaVers 2.9.2 (последняя версия, совместимая с Java 7). Начиная с версии 2.9.2, мы внесли множество изменений и рефакторингов, поэтому перенос функции из JaVers 3.6 обратно в версию 2.9 был бы кошмаром. Плана по поводу асинхронного коммита нет, думаю, мы сможем сделать это после отзыва коммита, может быть, в январе. - person Bartek Walacik; 14.10.2017
comment
Здравствуйте, @BartekWalacik, есть ли какие-либо планы по включению фиксации Asnc для SQL. Мы внедрили JaVers (javers-spring-boot-starter-sql) для аудита одного из наших предыдущих проектов, и теперь мы столкнулись с некоторыми проблемами с производительностью, и теперь мы ищем альтернативные варианты для нашего нового проекта. JaVers удобен со всеми хорошими функциями, кроме производительности. - person Asif Karim Bherani; 26.04.2019
comment
@AsifKarimBherani пока таких планов нет, создайте задачу github.com/javers/javers/issues , мы можем подумать об этом - person Bartek Walacik; 02.05.2019