Всем привет, в общем есть некий абстрактный крупный проект новостного сайта, делаю админку для него, в проекте DDD + CQRS.
И столкнулся с одной проблемой, при поиске новостей мы идем в эластик, получаем ID новостей, потом идем в разные домены и грузим источник новости, картинку, импортированные по RSS новости по этой теме, авторов, инфу о регионах, статистику. Таким образом, чтобы загрузить одну новость, мне нужно выполнить порядка 8 запросов на чтение, для 30 новостей на странице выдачи это 240 запросов, каждый из которых длиться около 10 миллисекунд итого получаем 2.5 секунды, что примерно в 12 раз дольше чем надо.
Так как оригинальный проект тупо огромный то нет смысла тут пытаться его разместить, попробую представить псевдо-кодом:
let clusters_ids = search_engine.search(filters, pagination);
for cluster_id in cluster_ids {
let published_news = news_service.get_news_by_id(cluster_id)?;
let news_source = news_source_service.get_web_resource_by_id(
published_news.imported_from_web_resource())?;
let author = authors_service.get_author_by_id(published_news.author_id())?;
let region = regions_service.get_region_by_id(published_news.region_id())?;
let image = images_service.get_image_by_id(published_news.image_id())?;
let statistics = statistics_service.get_statistics_by_news_id(published_news.id())?;
let parent_news = news_service.get_parent_news_by_id(published_news.id())?;
result.push(
DTO::builder()
.published_news(published_news)
.news_source(news_source)
.author(author)
.region(region)
.image(image)
.statistics(statistics)
.parent_news(parent_news)
.finish()
);
}
Собственно, проблема заключается в том, что нам нужно сходить в разные домены, чтобы собрать полный объект. Запросы по одному элементу очень долго выполняются так как из-за CQRS запрос летит по REST API в модель чтения и там читается в Postgres.
Я попробовал запускать в отдельных тасках получение дочерних объектов, ускорилось чуток.
Потом, я сделал функции, которые получают коллекцию объектов по коллекции ID-шников. Эти коллекции объектов запихнул в хешмапы и по ID новости беру все дочерние объекты. Стало выполняться за 600мс. Но это все равно очень долго.
Есть ли какие-то алгоритмы на такой случай? Или советы?