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