Микросервисы с общей базой данных? используя несколько ORM?

Я изучаю микросервисы и собираюсь создать проект с архитектурой микросервисов.

Дело в том, что один из моих товарищей по команде хочет использовать одну базу данных для всех сервисов, разделяя все таблицы так, чтобы "данные не повторялись", каждый сервис был бы построен с различными средами и языками, такими как django и rails, которые используют очень разные ORM стандарты.

Какой будет правильный подход? Поскольку я думаю, что работа с одной базой данных потребует много "взлома" ORM, чтобы заставить их работать правильно.

2 ответа

Решение

Вы вряд ли выиграете от архитектуры Microservices, если все службы используют одни и те же таблицы базы данных. Это потому, что вы эффективно тесно связываете сервисы. Если таблица базы данных изменяется, все службы должны будут измениться.

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

Вот цитата Вернера Фогелса, технического директора Amazon (Amazon впервые разработала архитектуру стиля Microservices):

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

Для получения дополнительной информации прочитайте это и это.

В целом, микросервис должен отвечать за свои данные. Это идеальный сценарий мира.

На практике некоторые услуги могут быть тесно связаны друг с другом. Например, службы CustomerShippingDetails и CustomerShoppingCheckout могут иметь доступ к одним и тем же данным - адресу клиента. Как бы вы тогда решили проблему предоставления адреса клиента в службу проверки клиентов. Если служба оформления заказа запрашивает информацию о покупках напрямую, вы нарушаете слабую связь между службами. Другой вариант - ввести общую базу данных.

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

Не имея слишком много подробностей о вашей системе, я бы использовал смешанный подход. То есть иметь общую базу данных для сервисов, которые заботятся о схожей бизнес-логике. Таким образом, CustomerShippingDetails и CustomerShoppingCheckout могут совместно использовать базу данных. Но StoreItemsDetails будет иметь отдельную базу данных.

Вы можете узнать больше о шаблоне общей базы данных для микросервисов в Microservice Architecture.

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