Как работает server-side интеграция

В client-side архитектуре путь выглядит так: сервер → HTML без рекомендаций → браузер → JS-сниппет → API персонализации → рекомендации отрисованы. Это два последовательных round-trip, и пользователь видит «мигание»: блок сначала пустой, потом заполняется.

В server-side архитектуре:

1. Запрос от браузера → Сервер магазина
2. Сервер → API платформы персонализации (параллельно с другими данными)
3. Сервер получает рекомендации, встраивает в HTML-шаблон
4. Готовая HTML-страница → Браузер

Пользователь видит рекомендации сразу при загрузке страницы — без задержки и мигания.

Архитектурные паттерны

Синхронный вызов

# Псевдокод: синхронный вызов при рендеринге страницы
def render_pdp(product_id, user_id):
    product = db.get_product(product_id)

    try:
        recommendations = personalization_api.get_recommendations(
            user_id=user_id,
            context={"product_id": product_id},
            timeout=200  # ms — жёсткий timeout
        )
    except TimeoutError:
        recommendations = bestsellers_cache.get()  # fallback

    return render_template("pdp.html", 
                           product=product,
                           recommendations=recommendations)

Параллельный вызов

Для страниц с несколькими блоками рекомендаций вызовы API запускаются параллельно:

with ThreadPoolExecutor() as executor:
    future_similar = executor.submit(api.similar_items, product_id)
    future_bought_together = executor.submit(api.bought_together, product_id)

similar = future_similar.result(timeout=0.2)
bought_together = future_bought_together.result(timeout=0.2)

Кэширование ответов

Тип контента Рекомендуемый TTL
Бестселлеры / тренды 15–60 мин
Рекомендации для анонима 5–15 мин
Персональные рекомендации (авторизованный) 1–5 мин

Кэширование на уровне сервера (Redis, Memcached) снижает нагрузку на API и устраняет риск деградации при пиковом трафике.

Когда выбирать server-side

  • SEO критичен — рекомендательные блоки должны индексироваться
  • Headless/API-first архитектура — нет единого JS-контекста
  • Высокий трафик — нужна предсказуемая производительность без зависимости от скорости браузера
  • Нет мигания (CLS) — важно для Core Web Vitals и UX

Совет: для начала внедрения нередко разумен гибридный подход: критичные блоки (главная карусель, PDP-рекомендации) — server-side; дополнительные (попапы, баннеры) — client-side JS. Это снижает объём разработки при первой интеграции.