Рассмотрите следующие микросервисы для проекта интернет-магазина:
Служба пользователей хранит данные учетной записи о пользователях магазина (включая имя, фамилию, адрес электронной почты и т.д.)
Служба покупок отслеживает информацию о покупках пользователей.
Каждая служба предоставляет пользовательский интерфейс для просмотра и управления соответствующими объектами.
На странице индекса Покупки перечислены покупки. Каждая позиция покупки должна иметь следующие поля:
id, полное имя покупающего пользователя, приобретенное название товара и цена.
Кроме того, в качестве части индексной страницы я хотел бы иметь окно поиска, позволяющее менеджеру магазина искать покупки, покупая имя пользователя.
Мне непонятно, как вернуть данные, которые Служба покупок не удерживает, например: полное имя пользователя. Проблема усложняется при попытке сделать более сложные вещи, такие как поиск покупок, путем покупки имени пользователя.
Я решил, что я, очевидно, смогу решить это, синхронизируя пользователей между двумя службами, передавая какое-то событие при создании пользователя (и сохраняя только соответствующие свойства пользователя в конце Службы покупок). Это далеко не идеальное в моей перспективе. Как вы справляетесь с этим, когда у вас есть миллионы пользователей? вы бы создали миллионы записей в каждой службе, которая потребляет данные пользователей?
Другим очевидным вариантом является предоставление API в конце службы пользователей, который возвращает данные пользователя на основе заданных идентификаторов. Это означает, что каждая загрузка страницы в Службе покупок, мне нужно будет позвонить в Службу пользователей, чтобы получить правильные имена пользователей. Не идеально, но я могу жить с ним.
Как насчет реализации поиска покупок на основе имени пользователя? Я всегда могу выставить еще одну конечную точку API в конце службы пользователей, которая получает запрос, выполняет текстовый поиск по именам пользователей в службе "Пользователи", а затем возвращает все данные пользователя, соответствующие критериям. В Службе закупок сопоставьте соответствующие идентификаторы с правильными именами и покажите их на странице. Этот подход также не идеален.
Я что-то упустил? Есть ли другой подход к реализации вышеизложенного? Может быть, тот факт, что я столкнулся с этой проблемой, - это своего рода запах кода? хотел бы услышать другие решения.