Senior
Backend-ი არსებობს, მომხმარებლის ინტერფეისიც. ტექნოლოგიური სია სტანდარტულია: Java, Spring, React, Postgres. მოსაზრება: შექმენით REST წერტილი, რომელიც უნდა მიიღოს მონაცემები 3 წყაროსგან და გადმოსცეს UI-ს, მაქსიმალური შესაძლებლობის და მინიმალური პასუხის დროის უზრუნველსაყოფად (მაქსიმუმ/მინიმუმ კრიტერიუმები ჩვენი კონკრეტული პირობების მიხედვით, რადგან არსებითად არ არსებობს ჯადოსნური გადაწყვეტა და საჭიროა კომპრომისის მოძებნა). ცნობილია, რომ ამ წერტილისთვის მოსალოდნელი პიკ RPS იქნება 200. მომწოდებლების შესახებ დეტალები: 1. წყარო - ჩვენი მონაცემთა ბაზა, შეკითხვა დაახლოებით 15 წამი გრძელდება. 2. წყარო - დაკავშირებული REST სერვისი, 100 RPS-ის ქვეშ 2 წუთამდე დეგრადირებს, ნორმალურ რეჟიმში პასუხობს 5 წამში. ამ წყაროს ქცევას ვერ შევცვლით. 3. წყარო - დაკავშირებული REST სერვისი, შემთხვევით (სპეციფიკური ნიმუშები არ არის გამოვლენილი) პასუხობს 503 შეცდომებით, ნორმალურ რეჟიმში პასუხობს 10 წამში. ამ წყაროს ქცევას ვერ შევცვლით.
sobes.tech AI
პასუხი 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);
Таким образом, достигается баланс между скоростью отклика и надежностью, учитывая ограничения и особенности каждого источника.