Senior
50
Ir ir backend, un lietotāja saskarne. Tehnoloģiju klāsts ir standarta: Java, Spring, React, Postgres. Uzdevums: izstrādāt REST galapunktu, kas jāiegūst datus no 3 avotiem un jānodod uz UI, nodrošinot maksimālo iespējamo caurlaidspēju un minimālo atbildes laiku (maksimālie/minimālie kritēriji pēc mūsu specifiskajiem nosacījumiem, jo būtībā nav burvju risinājuma un jāatrod kompromiss). Zināms, ka gaidāmais šī galapunkta maksimālais RPS būs 200. Zināmi avotu dati: 1. Avots - mūsu datu bāze, vaicājums ilgst apmēram 15 sekundes. 2. Avots - saistīts REST pakalpojums, degradējas līdz 2 minūtēm pie 100 RPS, normālā režīmā atbild 5 sekundēs. Šī avota uzvedību nevar mainīt. 3. Avots - saistīts REST pakalpojums, atbild nejauši (nav konstatēti specifiski modeļi) ar 503 kļūdām, normālā režīmā atbild 10 sekundēs. Šī avota uzvedību nevar mainīt.
Uzņēmumi, kur jautāja
солюшин
Atbilde no AI
sobes.tech AI
Для проектирования REST-эндпоинта с тремя источниками данных и учетом требований по пропускной способности и времени отклика, предлагаю следующий подход:
-
Асинхронный параллельный запрос к источникам:
- Запросы к базе и двум REST-сервисам выполняются параллельно, чтобы минимизировать общее время ожидания.
-
Кеширование:
- Для источника с долгим запросом к базе (15 сек) стоит реализовать кеширование результатов с разумным TTL, чтобы снизить нагрузку при пиковых запросах.
-
Таймауты и fallback:
- Для второго источника, который деградирует при высокой нагрузке, установить таймауты (например, 5-7 сек) и использовать кеш или возвращать частичные данные, если сервис не отвечает.
- Для третьего источника, который иногда возвращает 503, реализовать повторные попытки с экспоненциальной задержкой и fallback на кеш или дефолтные данные.
-
Реактивное программирование:
- Использовать Spring WebFlux или CompletableFuture для неблокирующего выполнения запросов и объединения результатов.
-
Агрегация и отдача данных:
- После получения данных из всех источников агрегировать их в единый ответ.
- Если какой-то источник не доступен, возвращать частичные данные с указанием статуса.
-
Мониторинг и ограничение нагрузки:
- Внедрить circuit breaker (например, Resilience4j) для защиты от деградации смежных сервисов.
- Ограничить количество одновременных запросов к проблемным источникам.
Пример использования CompletableFuture для параллельного запроса:
CompletableFuture<Data1> future1 = CompletableFuture.supplyAsync(() -> fetchFromDb());
CompletableFuture<Data2> future2 = CompletableFuture.supplyAsync(() -> fetchFromService2());
CompletableFuture<Data3> future3 = CompletableFuture.supplyAsync(() -> fetchFromService3());
CompletableFuture.allOf(future1, future2, future3).join();
// Обработка результатов с учетом ошибок и таймаутов
Data1 d1 = future1.getNow(null);
Data2 d2 = future2.getNow(null);
Data3 d3 = future3.getNow(null);
// Формируем ответ
return aggregate(d1, d2, d3);
Таким образом, достигается баланс между скоростью отклика и надежностью, учитывая ограничения и особенности каждого источника.