neo4j - мы собираемся дублировать доменные объекты на нескольких микросервисах, чтобы избежать присоединения приложений
Я планирую перенести существующие сервисы из mongodb в neo4j graphdb для сохранения. У меня есть профиль и сервис заказа, который использует монго-бэкэнд. Моя сущность домена заказа имеет ссылку на profileId, и я использую код приложения для соединения Order и профиля на основе profileId. Теперь, если я выберу neo4j, я хочу избежать присоединения кода приложения, но использую neo4j для выполнения простых и сложных требований объединения. Теперь вопрос в том, как мне избежать того, что в дизайне данный профиль и порядок находятся в 2 разных микросервисах? Как мне эффективно моделировать в neo4j и определять отношения между профилем и порядком, когда они присутствуют в двух микросервисах в ограниченном контексте. Собираюсь ли я дублировать профиль и заказать объекты, чтобы определить отношения. Пожалуйста помоги.
Например, Scenerios, как показано ниже:
Некоторые бизнес-транзакции должны применять инварианты, охватывающие несколько сервисов. Например, сценарий использования заказа на размещение должен подтвердить, что новый заказ не будет превышать кредитный лимит клиента. Другие бизнес-операции должны обновлять данные, принадлежащие нескольким службам.
Некоторые бизнес-транзакции должны запрашивать данные, которые принадлежат нескольким службам. Например, использование Просмотр доступного кредита должно запросить у Клиента кредитный лимит и Заказы для расчета общей суммы открытых заказов.
Некоторые запросы должны объединять данные, которые принадлежат нескольким службам. Например, для поиска клиентов в определенном регионе и их недавних заказов требуется объединение клиентов и заказов.
PS. цитируется из шаблона проектирования базы данных для каждой услуги
1 ответ
Если вы используете базу данных для каждой службы, то объединение между базами данных по определению является внеполосной операцией; нет никакого способа использовать эффективность объединения Neo4J в разных базах данных.
Другой вариант, который я мог бы видеть, - это использовать каждую микросервисную службу в одной и той же базе данных, но если вы собираетесь использовать базу данных для каждой службы, это невозможно.
Если вы чувствуете себя особенно предприимчивым и хитрым, я полагаю, что можно было бы добавить эту функциональность, используя множество пользовательских кодов, чтобы Neo4J мог обращаться к другим экземплярам для выполнения объединений, но это все равно будет намного медленнее, чем если бы существа находились в той же базе данных, так как это потребует связи по сети.
Кроме того, вышеупомянутое решение по-прежнему будет внеполосной обработкой и вполне может начать стирать разделение проблем, которое связано с архитектурой микросервисов. Будет ли это хорошо, будет зависеть от вас.