У меня проблемы с пониманием того, как следует установить базовую связь между микросервисами, и я не смог найти хорошего решения или стандартного способа сделать это в других вопросах.Давайте использовать этот базовый пример.
У меня есть сервис счетов, который возвращает счетов , каждый счет будет содержать информацию (идентификаторы)о пользователе и продуктах.Если у меня есть представление, в котором мне нужно отобразить счета для определенного пользователя, я просто делаю простой запрос.
let url = "http://my-domain.com/api/v2/invoices"
let params = {userId:1}
request(url,params,(e,r)=>{
const results = r // An array of 1000 invoices for the user 1
});
Теперь для этого конкретного представления мне потребуетсясделайте еще один запрос, чтобы получить все детали для каждого продукта в каждом счете.
results.map((invoice)=>{
invoice.items.map((itemId)=>{
const url=`http://my-domain.com/api/v2/products/${itemId}`
request(url,(e,r)=>{
const product = r
//Do something else.....
});
});
});
Я знаю, что пример кода не идеален, но вы можете видеть, что это вызовет огромное количество запросов (не менее 1000)к сервису продукта и только для одного пользователя, теперь представьте, если у меня есть 1000 пользователей, делающих такого рода запросы.
Как правильно получить информацию обо всех продуктах без необходимости делать это количество запросовчтобы избежать проблем с производительностью?.
Я нашел несколько обходных путей для таких сценариев, таких как:
- Создайте конечную точку API, которая принимает список идентификаторов для созданияодин запрос.
- Дублируйте информацию из службы Продукта в службе счетов и найдите способ их синхронизации.
В микрофонеАрхитектура roservices - это правильные способы решения таких проблем?Для меня они выглядят как простые обходные пути.
Правка № 1: На основе ответа Ремуса Русану.
Согласно рекомендации Ремуса, я решилчтобы выделить мои услуги и описать их немного лучше.
Как показано на рисунке выше, микросервисы теперь изолированы (в частности, биллинг-сервис) и теперь они являются владельцами данных.Используя эту структуру, я гарантирую, что Billing-service сможет работать, даже если есть асинхронные задания или даже если другие две службы не работают.
Если мне нужно создать новый счет, я могу позвонить другомудва микросервиса (Users, Inventory) синхронно, а затем обновите данные в таблицах «cache» (Users, Inventory) в моем биллинговом сервисе.
Можно ли предположить, что эти таблицы «cache» доступны только для чтения?Я предполагаю, что это так, поскольку только пользователь / службы инвентаризации должны иметь возможность изменять эту информацию, чтобы сохранить изоляцию и контроль над информацией.