У меня есть проблема концептуального / дизайнерского характера, которую я не могу решить. Я попытаюсь объяснить это на примере спортивной терминологии, но, конечно, та же проблема может быть применена к интернет-магазину или любой другой системе.
Я хочу создать 2 автономных микросервиса с API для выполнения необходимых действий. Служба A будет заниматься управлением игроками, а служба B - управлением командой.
В Сервисе A я могу, например, обучать игроков, покупать предметы для игроков, настраивать внешний вид игрока и т. Д. В Сервисе B я могу, например, устанавливать тактику команды, нанимать персонал команды, устанавливать внешний вид команды (логотип, цвет) и т. Д.
Я прочитал много статей и тем о микросервисах, и как написано в одной статье: ... самая сложная часть о микросервисе = ваши данные ...
И вот моя проблема. Как и где я должен хранить отношения между игроком и командой (представьте таблицу TeamPlayer как простую таблицу отношений со столбцами player_id, team_id)? Итак, вот мои опасения:
- Должна ли быть таблица TeamPlayer частью микросервиса A или B? Или оба микросервиса должны использовать одну и ту же базу данных?
- Если это будут автономные базы данных, и если я решу, что микросервис B будет хранить это отношение, как я могу подтвердить, что этот игрок существует? Что, если кто-то прислал мне неправильный идентификатор игрока? Или мне нужно заботиться? Нужно ли мне подтверждать, что проигрыватель существует, или это не проблема микросервиса B? Конечно, microserivce B знает команды, поэтому я могу вернуть ошибку, если указан неправильный идентификатор команды. Я не хочу вызывать микросервис A из микросервиса B, потому что тогда я свяжу их вместе и сделаю зависимость от микросервиса B до микросервиса A.
- Если это будут автономные базы данных, как я буду читать данные? Представьте, что в пользовательском интерфейсе мне нужен список имен игроков внутри команды. Microsoervice B знает команду и просто отношения, а микросервис A знает имена. Мне нужно сделать как минимум два звонка для сбора данных?
- Если это будет общая база данных, может ли микросервис B напрямую читать некоторые данные о плеере из базы данных? Я могу представить себе ситуацию, когда это не должно быть разрешено из-за некоторых прав доступа и т. Д., Но вся эта бизнес-логика встроена в микросервис A API, который обычно считывает и возвращает данные о плеере.
Как решить эту проблему наилучшим образом? Является ли шлюз API ответом или как это сделать наилучшим образом?
Я надеюсь, что ясно, что меня беспокоит :)