Микросервисы с общей базой данных? используя несколько ORM?
Я изучаю микросервисы и собираюсь создать проект с архитектурой микросервисов.
Дело в том, что один из моих товарищей по команде хочет использовать одну базу данных для всех сервисов, разделяя все таблицы так, чтобы "данные не повторялись", каждый сервис был бы построен с различными средами и языками, такими как django и rails, которые используют очень разные ORM стандарты.
Какой будет правильный подход? Поскольку я думаю, что работа с одной базой данных потребует много "взлома" ORM, чтобы заставить их работать правильно.
2 ответа
Вы вряд ли выиграете от архитектуры Microservices, если все службы используют одни и те же таблицы базы данных. Это потому, что вы эффективно тесно связываете сервисы. Если таблица базы данных изменяется, все службы должны будут измениться.
Вы должны понимать, что основная причина архитектуры микросервисов состоит в том, чтобы уменьшить зависимости между группами разработчиков и позволить им продвигаться независимо с быстрыми выпусками.
Вот цитата Вернера Фогелса, технического директора Amazon (Amazon впервые разработала архитектуру стиля Microservices):
Для нас ориентация на сервис означает инкапсуляцию данных с помощью бизнес-логики, которая работает с данными, с единственным доступом через опубликованный интерфейс сервиса. Прямой доступ к базе данных не разрешен извне службы, и нет обмена данными между службами.
Для получения дополнительной информации прочитайте это и это.
В целом, микросервис должен отвечать за свои данные. Это идеальный сценарий мира.
На практике некоторые услуги могут быть тесно связаны друг с другом. Например, службы CustomerShippingDetails и CustomerShoppingCheckout могут иметь доступ к одним и тем же данным - адресу клиента. Как бы вы тогда решили проблему предоставления адреса клиента в службу проверки клиентов. Если служба оформления заказа запрашивает информацию о покупках напрямую, вы нарушаете слабую связь между службами. Другой вариант - ввести общую базу данных.
Всегда будет какой-то компромисс по архитектуре. То, что принесено в жертву, является архитектурным решением, которое сильно зависит от общей картины (дизайн всей системы).
Не имея слишком много подробностей о вашей системе, я бы использовал смешанный подход. То есть иметь общую базу данных для сервисов, которые заботятся о схожей бизнес-логике. Таким образом, CustomerShippingDetails и CustomerShoppingCheckout могут совместно использовать базу данных. Но StoreItemsDetails будет иметь отдельную базу данных.
Вы можете узнать больше о шаблоне общей базы данных для микросервисов в Microservice Architecture.