При использовании архитектуры микросервисов станет ли узким местом базовая база данных для чтения / записи?

#sql #amazon-web-services #scalability #microservices

#sql #amazon-веб-сервисы #масштабируемость #микросервисы

Вопрос:

Как я описал в вопросе, если бы я внедрил архитектуру микросервисов, стала бы централизованная база данных чтения / записи узким местом?

Чтобы расширить с помощью примера, допустим, у меня есть три микросервиса: users , teams и team_members . У каждого из них есть свой собственный микросервис, но все они полагаются друг на друга в базе данных, поэтому эксклюзивные параллельные базы данных были бы неподходящими. Поскольку микросервисы предназначены для распределения работы на нескольких разных серверах, не сводит ли центральная база данных в конечном итоге на нет назначение этих микросервисов, поскольку все они в конечном итоге обращаются к одному и тому же серверу?

Комментарии:

1. Это зависит от слишком многих переменных факторов. Какую базу данных вы используете? Какой объем операций ввода-вывода с базой данных генерируют ваши службы? Ваш вопрос слишком широкий и, вероятно, будет закрыт.

Ответ №1:

…если бы я внедрил архитектуру микросервисов, стала бы централизованная база данных чтения / записи узким местом?

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

Фактически, далее по вашему вопросу вы непосредственно озвучиваете эту концепцию:

…но все они полагаются друг на друга в базе данных, поэтому эксклюзивные параллельные базы данных были бы неподходящими.

Если микросервисы совместно используют таблицы базы данных, то все, что вы эффективно сделали, — это создали одну единственную «службу» с несколькими компонентами, которые, как оказалось, потребляют друг друга по какой-то внеполосной передаче, а не по прямой двоичной ссылке в памяти.

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

Расширяя ваш пример, служба пользователей будет знать о командах. Как он узнает? Что ж, служба команд передаст данные команды в службу пользователей. Аналогичным образом, служба team_members будет получать данные от обеих служб. Теперь у всех служб есть все данные, необходимые им для выполнения своей работы.

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

Комментарии:

1. Спасибо, это было действительно полезно, указав мне правильное направление. Я студент университета, пытающийся самостоятельно освоить архитектуру микросервисов.

Ответ №2:

Чтобы добавить к тому, на что был дан ответ выше…

При декомпозиции вашего домена вместо использования модели взаимодействия с одним объектом используйте взаимодействие свойств / полей и ограниченный контекст для создания ваших компонентов / микросервисов.

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

И еще один компонент может содержать адрес пользователя, и еще один — информацию о возрасте, поле и семейном положении пользователя, и еще один будет содержать его кредитную карту и банковские реквизиты…

В итоге вы получите отдельные таблицы для каждого ограниченного контекста.

Способ размещения таблиц зависит от вашей нагрузки и инфраструктуры (все таблицы в одной базе данных и на одном сервере или нескольких базах данных / серверах).

Просто чтобы уточнить, эти таблицы не имеют ссылочной целостности, если бы у вас была ссылочная целостность, вы бы повторно ввели связь, и это вернет вас к проблеме конкуренции в базе данных…

Посмотрите эту презентацию Уди Дахана, чтобы узнать гораздо больше деталей

Ответ №3:

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

Лучше иметь отдельный экземпляр базы данных для каждого микросервиса и использовать кэширование для общих таблиц / данных.