Монолит к микросервису

Мы планируем перейти от монолитной архитектуры к микроуслугам. Теперь я несу ответственность за вывод модуля из монолита.

Существующий Монолит:

1) Код очень тесно связан.

2) API вызываются рекурсивно с разными параметрами.

3) Некоторые вызовы с модулем, который я планирую извлечь, содержат вызовы системы, выполнение которых занимает около 9 минут. К сожалению, это синхронно.

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

1) Я начинаю с одной миграции API, которая является очень важной и неэффективной. 2) Этот API состоит из параллельных вызовов в другую систему для выполнения множества задач. Все вызовы блокируют и отнимают много времени (среднее время ответа 5-6 минут)

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

а) движется поэтапно:

 - Create a separate module 
 - In this module provide an api to push events to kafka, another 
   module will in-turn process the request and push the response back 
   to kafka
 - monolith for now will call above mentioned api to push events to 
   kafka
 - New module will inturn call back the monolith when the task 
   complete (received response on a separate topic in kafka)
 - Monolith once get response for all the tasks will trigger some post 
   processing activity.

 Advantage:
 1) It will solve the problem of sync- blocking call.

 Disadvantage:
 1) Changes are required in the monolith, which could introduce some 
    bugs.
 2) No fallbacks are available for the case if bug gets introduced.

б) Переместить API сразу в микросервис:

  • Изначально, который будет делить общий источник данных с монолитом и решать проблему блокировки вызовов посредством введения kafka между новым микросервисом и модулем, который занимает время для обработки запроса.

    Преимущество:

    1) Откат доступен в монолите

    Недостаток:

    1) Первоначально источник данных совместно используется системами.

Каким должен быть наилучший подход для решения подобных сложных задач?

1 ответ

Вы должны позаботиться о нескольких вещах.

Первый

Переход на микросервис будет медленнее (90% времени), чем монолит, потому что вы вводите время ожидания. Поэтому никогда не забывайте об этом, когда вы идете с этим.

второй

Вы спрашиваете, если это хороший способ пойти с кафкой. Я могу ответить "да" в большинстве случаев, но вы упомянули, что сегодня процесс является синхронным. Если это по транзакционным причинам, вы не сможете решить это с брокером сообщений, я полагаю, потому что вы обновите свою систему строгой согласованности в конечном итоге. https://en.wikipedia.org/wiki/Eventual_consistency

Я не говорю, что это плохое решение только потому, что оно меняет ваш рабочий процесс и может повлиять на некоторые бизнес-правила.

В качестве решения я предлагаю это:

1 - Разорвать швы в вашем монолите, введя функциональный ключ и композицию API внутри монолита (прочитайте книгу Сэма Ньюмана, чтобы помочь).

2 - Введите возможную последовательность внутри монолита, чтобы проверить, соответствует ли он цели. Откат будет проще, если нет.

Нет, у вас есть возможность:

Второй шаг прошел хорошо, поэтому пошли дальше и поместили код сервиса в микросервис из монолита.

Второй шаг не подошел, тогда подумайте о том, чтобы сделать что-то рискованное в конкретном сервисе или использовать распределенные транзакции (будьте осторожны с этим решением, которым может быть сложно управлять).

Я считаю, что лучшим подходом будет вариант 1: движение поэтапно. Однако это можно сделать, имея запасную стратегию. Вы можете оставить нетронутую версию бэкэнда в качестве резервной копии, если ваша новая служба столкнется с проблемами.

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

Другие вопросы по тегам