SlandShow
@SlandShow
70% of my body is made of movies.

Как правильно реализовать версионную миграцию в микросервисах?

Стоит следующая задача.

Имеются сервисы, которые используют некий набор общим кастомных модулей-стартеров.

Этот стартер представляет из себя некий набор библиотечек, одной из которых является Camunda BPMN. И вот важно понимать что у движка этой Camunda есть своя база, т.е каждый сервис, который использует внутри себя возможности Camunda - должен подтянуть зависимость. И каждый такой сервис имеет свою собственную базу, на которую движок и накатывает служебные таблички и прочие вещи.

Происходит следующая вещь: движок в этом общем стартере обновляется, а значит каждый сервис неявно подвержен к изменениям, так как обновление влечёт за собой какие-то DDL/DML SQL изменения, они даже публикуются. Так вот, нельзя допустить потерю данных при обновлении движка. По дефолту каждый такой сервисок имеет у себя версионную миграцию через liquibase.

Моя идея заключается в том, чтобы внутри стартера написать общий функционал, который будет доступен из коробки. И в таком случае нужно провести миграцию, написав скриптик. Каждый сервис, подтягивая этот стартер, так же будет выполнять этот скриптик. И тут важно сказать, что нужно не дать ошибкам выползти, нельзя производить миграцию N-е кол-во раз, поэтому я решил использовать предусловия и получил что-то такое:
--preconditions onFail:CONTINUE onError:CONTINUE
ALTER TABLE ACT_HI_OP_LOG
    ADD CATEGORY_ VARCHAR(64);

--preconditions onFail:CONTINUE onError:CONTINUE
ALTER TABLE ACT_HI_OP_LOG
    ADD EXTERNAL_TASK_ID_ VARCHAR(64);

--preconditions onFail:CONTINUE onError:CONTINUE
CREATE TABLE ACT_GE_SCHEMA_LOG
(
    ID_        VARCHAR(64),
    TIMESTAMP_ timestamp,
    VERSION_   VARCHAR(255),
    PRIMARY KEY (ID_)
);

--preconditions onFail:CONTINUE onError:CONTINUE
INSERT INTO ACT_GE_SCHEMA_LOG
VALUES ('0', CURRENT_TIMESTAMP, '7.11.0');

--preconditions onFail:CONTINUE onError:CONTINUE
CREATE INDEX ACT_IDX_HI_OP_LOG_USER_ID ON ACT_HI_OP_LOG (USER_ID_);

--preconditions onFail:CONTINUE onError:CONTINUE
CREATE INDEX ACT_IDX_HI_OP_LOG_OP_TYPE ON ACT_HI_OP_LOG (OPERATION_TYPE_);

--preconditions onFail:CONTINUE onError:CONTINUE
CREATE INDEX ACT_IDX_HI_OP_LOG_ENTITY_TYPE ON ACT_HI_OP_LOG (ENTITY_TYPE_);


Эта идея является правильной?
  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Идея выглядит очень рискованной.
Ответ написан
Комментировать
@RekGRpth
попробуйте sqitch и pgtap
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы