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

Я пытаюсь преобразовать одно монолитное приложение в стиль архитектуры, ориентированный на микросервисы. Бэкэнд Я использую Spring, Spring Boot Framework для разработки. Во внешнем интерфейсе я использую angular 2. А также использую PostgreSQL в качестве базы данных.

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

С другой стороны, я думаю, что разделить текущую структуру по горизонтали. Итак, мой домен основан на каком-то образовательном университете. Таким образом, половина университета работает под одной БД, а остальные — под другой БД. И развернуть услуги в соответствии с двумя регионами (два на два набора вуза).

В настоящее время я решил продолжить последний упомянутый подход. Я новичок в этих типах задач, так как это относится к какой-то архитектурной задаче. Также я новичок в этом мире микросервисов и распределенных баз данных. Кто-нибудь подтвердит, что мой подход даст решение моей проблемы? Могу ли я продолжить свой второй подход — горизонтальное разделение баз данных в соответствии с объектами домена?


person Jacob    schedule 05.03.2018    source источник


Ответы (3)


Могу ли я продолжить мой второй подход — горизонтальное разделение баз данных в соответствии с объектом домена?

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

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

  1. Небольшие компоненты - проще управлять
  2. Независимое развертывание — непрерывная доставка
  3. Несколько языков
  4. Код организован вокруг бизнес-возможностей
  5. а также .....

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

Одна служба должна быть совершенно не осведомлена о том, как другая служба разработала свою внутреннюю структуру.

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

Кроме того, при переходе к микросервисам вы столкнетесь с множеством других проблем. Я попытался скомпилировать, как следует начинать работу с микросервисами, по этой ссылке .

Как разделить службы, которые читают данные из одной таблицы:

Теперь давайте сначала создадим фиктивный пример: у нас есть три сервиса Order , Shipping , Customer — три разных микросервиса.

Ниже приведены способы, которыми несколько служб требуют данные из одной таблицы:

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

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

Например: при размещении заказа будет вызываться API службы заказов с идентификатором клиента, теперь, когда службе заказов может потребоваться проверить, является ли он действительным клиентом или нет.

Один из подходов: раскрытие информации на уровне базы данных — не рекомендуется — использовать одну и ту же таблицу клиентов, которая привязывает обслуживание заказов к обслуживанию клиентов.

Другой подход: позвоните в другую службу для получения данных

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

Вариант - 2 не проверять при размещении заказа, при проверке события OrderPlaced асинхронно из службы поддержки клиентов и при необходимости проверять и обновлять состояние заказа

Я рекомендую Позвонить в другую службу, чтобы получить данные на основе требуемой согласованности.

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

Например: Удалить клиента. вы можете захотеть, чтобы весь заказ клиента также был удален.

В этом случае вам нужно иметь дело с окончательной согласованностью, служба 1 вызовет событие, а затем служба 2 отреагирует соответствующим образом.

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

Если все еще не решено, вы можете написать мне по адресу [email protected], я вам отвечу

person techagrammer    schedule 07.03.2018
comment
Да, сэр, ваши утверждения верны. В любом случае спасибо за ваш ответ и потраченное время на мою проблему. Я уже ознакомился с рекомендациями по проектированию баз данных, связанными с вертикальной фрагментацией и микросервисной архитектурой. Я нашел то же самое, что вы добавили здесь - создание сервиса самостоятельно. Но у меня есть одна путаница: если мои функции более чем одной службы зависят от одних и тех же таблиц, то как мне с этим управлять? мои 4 независимые функции берут данные из одних и тех же таблиц. - person Jacob; 07.03.2018
comment
обычно этого не должно происходить, если вы можете дать описание таблицы и какие ваши функции смогут помочь лучше??? - person techagrammer; 07.03.2018
comment
В данный момент анализирую. Нужно сделать это. Позвольте мне сказать мою точку зрения. Предположим, если какая-то таблица содержит данные, которые обычно используются в двух разных микросервисах, то операции CRUD не будут синхронизированы. У меня есть некоторые функции землеустройства. Все службы ссылаются на некоторые мои общие таблицы. Так как же в таком случае я могу добиться независимости? Извините, что не дал фактический дизайн. Я все еще анализирую эту задачу. Все еще делаю общее представление об управлении сервисной БД. - person Jacob; 07.03.2018
comment
Например - Моя функциональность F1 ссылается на таблицы T1, T2, T3. Функциональность F2 ссылается на таблицы T1, T2, T4, T5. И F3 ссылается на таблицу T1. Таким образом, каждый из них является независимым сервисом из одного домена. Итак, как мне нужно создавать разные базы данных для каждой функции? . Здесь я не раскрываю точную функциональность проекта, извините за это. Мне нужно реализовать эти 3 конечные точки в одном весеннем проекте загрузки с БД, содержащей все таблицы, или в виде разных проектов? Как эта структура выйдет на сцену? , я сталкиваюсь с множеством недоразумений, так как я новичок в мире обслуживания и весенней загрузке. - person Jacob; 07.03.2018
comment
Хорошо, сэр. Позвольте мне проверить ваш ответ. Спасибо. - person Jacob; 07.03.2018
comment
Да, я нашел способ решения. Он вызывает другой метод обслуживания, который вы рекомендовали (другой подход). Он будет работать для моего сценария. А также я изучу функциональность удаления клиента, которую вы объяснили. В любом случае спасибо за ваш ответ и потраченное время на мои проблемы. Спасибо. - person Jacob; 07.03.2018

В настоящее время я решил продолжить последний упомянутый подход.

Если вам нужна горизонтальная масштабируемость (масштабирование для все большего числа клиентских подключений) для вашей базы данных, вам может быть лучше с технологией, которая была разработана для работы в качестве масштабируемой распределенной системы. Что-то вроде CockroachDB или NoSQL. Cockroachdb, например, имеет встроенные функции разделения и репликации данных и позволяет вам расширяться за счет добавления серверных узлов по мере необходимости.

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

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

person Oswin Noetzelmann    schedule 06.03.2018

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

Теперь, что касается размещения данных, существуют различные варианты — вы можете хранить данные, принадлежащие микросервису, в базе данных NoSQL, такой как MongoDB, DynamoDB, Cassandra (это действительно зависит от варианта использования микросервиса) ИЛИ вы можете иметь другую таблицу для каждая микрослужба в одном экземпляре базы данных SQL. НО помните, что если вы выберете один экземпляр базы данных SQL с несколькими таблицами, тогда не будет никаких соединений (по сути, никакого взаимодействия) между таблицами, принадлежащими разным микросервисам.

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

person Kanishk    schedule 07.03.2018
comment
Спасибо за ваш ответ, сэр. Если я фрагментирую БД по вертикали, то она будет правильно подходить для достижения реальных преимуществ архитектуры, ориентированной на микросервисы. Но в моем сценарии несколько моих функций берут данные из одних и тех же таблиц. Поэтому, если я выбираю эту БД для другой службы, операция CRUD не будет синхронизирована, поскольку я беру одну и ту же БД для более чем одной независимой службы. Итак, как мне в этой ситуации управлять фрагментацией БД и проектированием сервисов? Не могли бы вы проверить мои пункты, что я упомянул в этом заявлении? - person Jacob; 07.03.2018
comment
По сути, частичная причина иметь отдельную БД для каждого микросервиса именно из-за проблем, когда у вас есть несколько писателей. Было бы меньше проблем, если бы только 1 микросервис мог изменять данные в этой таблице. Нет проблем с чтением данных из этих таблиц другими микросервисами (но вы определенно потеряете преимущество слабой связи). Ничто не мешает вам считывать данные непосредственно из таблиц, принадлежащих другим микросервисам, но предпочтительный способ доступа к этим данным — через API этого владельца данных. - person Kanishk; 08.03.2018
comment
Если вы все еще хотите обойти маршрут API и читать данные напрямую, другой способ — иметь некоторое дублирование, поддерживая несколько таблиц (несколько наборов) одних и тех же данных (где вам не нужно беспокоиться о синхронизации. Каждая транзакция записи будет обновлять все повторяющиеся таблицы одновременно). Каждый микросервис будет поддерживать свой собственный набор интересующих его данных. Запись будет происходить только через 1 микросервис, но данные будут обновляться во всех таблицах одновременно. - person Kanishk; 08.03.2018