Мы находимся в процессе миграции монолитного приложения на микросервисную архитектуру. Из-за некоторых нормативных требований мы должны хранить данные о клиентах из разных стран в отдельных (специфичных для страны) базах данных. То есть US db для клиентов в США, UK db для клиентов в Великобритании ...
Следующие проекты, которые мы рассматриваем, следующие:
Вариант 1: мультитенантное приложение с поддержкой мультитенантного режима гибернации, которое можно масштабировать до N раз в зависимости от спроса (вспомните о модулях kubernetes). Один экземпляр этого приложения сможет подключаться ко всем базам данных.
Вариант 2. Развертывание 1 экземпляра микросервиса для каждой базы данных страны. С шлюзом API перед ними маршрутизация трафика
Если бы вы разработали этот тип системы, каким был бы ваш выбор?
источник
Ответы:
Я думаю, что вариант 2 не плохой, но может и не понадобиться. Микро-сервисы предназначены для того, чтобы вы могли удовлетворить потребности нескольких приложений.
Важным фактором здесь является то, есть ли какая-либо разница между двумя схемами и будет ли когда-либо в будущем.
Обычно я думаю, что использование интерфейсов для репозиториев не нужно; однако, это может стоить усилий в этом случае. Хранилища заводов будут важны для вас.
Моя проблема с вариантом 1 заключается в том, что он слишком конкретен. Вы должны быть в состоянии перейти от установки, которую вы описали, к двум отдельным экземплярам, каждый из которых легко указывает на свою собственную БД. Приложение не должно заботиться о том, где оно получает данные.
Хотя схема не отличается для двух разных баз данных, вы можете иметь один репозиторий, который легко справится с обоими, и приложение не будет знать разницу:
Если схемы БД когда-нибудь станут несопоставимыми между США и Великобританией, вы затем разделите функциональность на два совершенно разных репозитория. Это было бы легко, поскольку все, что вам нужно было бы сделать - это сменить завод.
источник
Я бы пошел со вторым вариантом, он дает меньше трения при разработке и развертывании.
Это обеспечит лучшую масштабируемость и доступность, а также лучшие варианты развертывания без простоев, так как вы распределили свое приложение на 1 (или хотя бы один) экземпляр на регион, а не на один для всего мира.
По мере изменения требований у вас может появиться больше бизнес-логики для конкретного региона и, возможно, также для изменений данных, я постараюсь разделить код и его данные по регионам и избегать совместного использования бизнес-логики, специфичной для региона (в конечном итоге вы можете разделить некоторый основной код).
Есть смысл?
источник