Sobes.tech
Middle+
95

Bir arka uç, bir ön uç var. Standart yığın: Java, Spring, React, Postgres. Görev: 3 kaynaktan veri alıp UI'ye gönderen ve mümkün olan en yüksek kapasite ile en düşük yanıt süresini sağlayan bir REST uç noktası tasarlamak (maksimum/maksimum kriterler, çünkü esasen sihirli bir çözüm yok ve bir uzlaşma bulunmalı). Bu REST uç noktasının beklenen maksimum RPS'sinin 200 olduğu bilinmektedir. Kaynaktan bilinen detaylar: 1. Kaynak - bizim veritabanımız, sorgu yaklaşık 3 saniye. 2. Kaynak - ilişkili bir REST servisi, 100 RPS altında 2 dakikaya kadar düşer, normal modda 5 saniyede yanıt verir. Bu kaynağın davranışını değiştiremeyiz. 3. Kaynak - başka bir ilişkili REST servisi, rastgele 503 hatası verir (belirli bir desen bulunmamaktadır), normal modda 10 saniyede yanıt verir. Bu kaynağın davranışını değiştiremeyiz.

Sorulan şirketler
СБЕРСБЕР

AI'dan gelen yanıt

sobes.tech yapay zeka

Для проектирования REST-эндпоинта с тремя источниками данных и требованиями по максимальной пропускной способности и минимальному времени отклика, учитывая особенности источников, можно предложить следующий подход:

  1. Асинхронный вызов источников:

    • Запрос к базе (3 сек) можно выполнять параллельно с вызовами к REST-сервисам.
    • Вызовы к двум REST-сервисам также выполнять параллельно.
  2. Кэширование:

    • Для второго источника, который деградирует при высокой нагрузке, стоит использовать кэширование результатов, чтобы снизить количество запросов к нему.
    • Кэш можно обновлять с определённой периодичностью или по событию.
  3. Обработка ошибок и таймауты:

    • Для третьего источника, который может отдавать 503, нужно реализовать механизм повторных попыток с экспоненциальной задержкой и fallback (например, возвращать последние успешные данные или заглушку).
    • Установить разумные таймауты для всех запросов, чтобы не блокировать ответ UI.
  4. Пул потоков и ограничение параллелизма:

    • Для REST-сервисов использовать пул потоков с ограничением количества одновременных запросов, чтобы не перегружать внешние сервисы.
  5. Сбор и агрегация данных:

    • После получения данных из всех источников агрегировать их и отдать UI.
  6. Мониторинг и метрики:

    • Внедрить мониторинг времени отклика и ошибок, чтобы оперативно реагировать на деградацию.

Пример упрощённого кода на Java с использованием CompletableFuture:

CompletableFuture<Data1> dbFuture = CompletableFuture.supplyAsync(() -> fetchFromDb());
CompletableFuture<Data2> service2Future = CompletableFuture.supplyAsync(() -> fetchFromService2WithCache());
CompletableFuture<Data3> service3Future = CompletableFuture.supplyAsync(() -> fetchFromService3WithRetry());

CompletableFuture.allOf(dbFuture, service2Future, service3Future).join();

Data1 d1 = dbFuture.get();
Data2 d2 = service2Future.get();
Data3 d3 = service3Future.get();

Response response = aggregate(d1, d2, d3);
return response;

Таким образом, достигается баланс между временем отклика и нагрузкой на внешние сервисы, а также обеспечивается устойчивость к ошибкам.