У меня сейчас два микросервиса. Мы им позвоним A
и B
.
База данных под микросервисом A
имеет следующую таблицу:
A
|-- users
База данных под микросервисом B
имеет следующую таблицу:
B
|-- trackers
Требования утверждают, что users
и trackers
имеют отношение многие ко многим.
Я не уверен, как правильно справиться с этим в архитектуре микросервисов.
Я мог видеть, что это работает одним из трех способов:
user_trackers
Таблица добавляется к microserviceA
. Это действует подобно таблице соединения, содержащей «внешние ключи» дляusers
иtrackers
.owners
Таблица добавляется к microserviceB
. Эта таблица действует аналогично таблице полиморфного соединения. Это позволило бы любой службе создать ассоциацию с трекером. Это может выглядеть примерно так:B |-- trackers |-- owners |-- owner_id |-- owner_type |-- tracker_id
- Храните записи для
users
иtrackers
в каждом microservice. Держите их в синхронизации с какой-то системой pubsub.
Изначально я собирался пойти с вариантом 2, потому что мне понравилось, что он сохранил границы транзакций. Я могу создать трекер и связать его с чем-то атомарно. Тем не менее, это кажется вне сферы применения микросервиса B
. Почему микросервис должен B
заботиться о том, что микросервис A
хочет создать ассоциацию?
Я чувствую, что здесь, вероятно, есть хороший образец, о котором я не знаю. Имеет ли смысл какой-либо из предложенных мной вариантов? Есть ли другой вариант, который может иметь больше смысла?
источник
Ответ Западло содержит много полезной информации и аргументацию. Я собираюсь добавить небольшой практический совет, который поможет вам разобраться в ваших проблемах, и совет в этом ответе.
То, как вы сформулировали свой вопрос о дизайне, связано со структурами баз данных и с тем, чтобы соответствовать новым требованиям для ваших структур. Это означает, что вы строите дизайн сервиса из вашей модели данных. Например, то, что я не вижу, - это как получить доступ или использовать отношения между пользователями и трекерами.
В сервисном дизайне структура интерфейса является самой важной вещью в дизайне. На самом деле, реализация практически не имеет отношения к сравнению, особенно в случае микросервисов. Причина в том, что после того, как вы поставили свою службу на место, все зависимости от вашей службы должны существовать только на интерфейсе. Если вы понимаете это правильно, вы сможете полностью переписать реализацию без какого-либо потребителя. И это главное преимущество автономии. Никого не волнует, как вы его построили. Им просто нужно, чтобы это работало так, как вы сообщали, что будет.
Прежде чем кто-либо сможет определить, как это выглядит в базе данных или где вы хотите этого, вам действительно нужно объяснить, как эта информация будет использоваться. Это то, что будет раскрыто через службу, или это какие-то данные, которые вы хотите перетасовать для аналитики?
Кстати, я бы избегал двунаправленных зависимостей практически любой ценой. Если у вас есть зависимости, вы действительно хотите, чтобы только одна сторона знала о другой. Как только зависимости находятся в обоих направлениях, их сервисы становятся по существу атомарной единицей.
источник
Многое из этого сводится к самому домену. Если пользователь с нулевыми трекерами не имеет смысла, то сервис пользователя должен знать о трекерах. Если у трекера должен быть пользователь, трекерам необходимо знать о пользователях. Если что-то вроде наличия трекера с несколькими владельцами или возможности передачи трекера от одного пользователя к другому имеет смысл, то, возможно, эта информация принадлежит еще одному сервису.
источник
Вопрос: Почему ваши данные разделены по Datatables?
Я бы предпочел перейти к варианту 3: сервисы полностью отделены друг от друга и могут отвечать на соответствующие вопросы, которые могут им понадобиться. Кроме того, они намного более устойчивы. Но будьте осторожны, ваши сервисы могут десинхронизироваться, если пропустят события, но это можно решить путем возможной согласованности.
Кроме того, вы можете рассмотреть возможность объединения обеих служб - если оба не могут отвечать, не зная друг о друге, я бы просто объединил их, поскольку они, вероятно, являются частью одного домена.
источник