neo4j - мы собираемся дублировать доменные объекты на нескольких микросервисах, чтобы избежать присоединения приложений

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

Например, Scenerios, как показано ниже:

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

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

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

PS. цитируется из шаблона проектирования базы данных для каждой услуги

1 ответ

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

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

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

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

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