Middle+
97
Ҳам бекенд, ҳам фронтенд мавжуд. Стек стандарт: Java, Spring, React, Postgres. Вазифа: 3 манбаадан маълумот олиш ва UI га юбориш учун REST endpoint лойиҳалаштириш, максимал имконият ва минимал жавоб вақтини таъминлаш (максимум/минимум мезонлар, чунки асосан ажойиб ечим йўқ ва компромисс топиш керак). Бу REST endpoint учун кутилган максим RPS 200 бўлади. Манбалар ҳақида маълумотлар: 1. Манба - бизнинг маълумотлар базамиз, сўров тахминан 3 сония. 2. Манба - боғлиқ REST хизмати, 100 RPS остида 2 дақиқагача деградлашади, нормал режимда 5 сонияда жавоб беради. Бу манбанинг хулқ-атворини ўзгартириб бўлмайди. 3. Манба - бошқа боғлиқ REST хизмати, тасодифан 503 хато қайтариб (аникл шаблон топилмади), нормал режимда 10 сонияда жавоб беради. Бу манбанинг хулқ-атворини ўзгартириб бўлмайди.
Ширкатҳо дар куҷо пурсиданд
Ҷавоб аз AI
sobes.tech AI
Для проектирования REST-эндпоинта с тремя источниками данных и требованиями по максимальной пропускной способности и минимальному времени отклика, учитывая особенности источников, можно предложить следующий подход:
-
Асинхронный вызов источников:
- Запрос к базе (3 сек) можно выполнять параллельно с вызовами к REST-сервисам.
- Вызовы к двум REST-сервисам также выполнять параллельно.
-
Кэширование:
- Для второго источника, который деградирует при высокой нагрузке, стоит использовать кэширование результатов, чтобы снизить количество запросов к нему.
- Кэш можно обновлять с определённой периодичностью или по событию.
-
Обработка ошибок и таймауты:
- Для третьего источника, который может отдавать 503, нужно реализовать механизм повторных попыток с экспоненциальной задержкой и fallback (например, возвращать последние успешные данные или заглушку).
- Установить разумные таймауты для всех запросов, чтобы не блокировать ответ UI.
-
Пул потоков и ограничение параллелизма:
- Для REST-сервисов использовать пул потоков с ограничением количества одновременных запросов, чтобы не перегружать внешние сервисы.
-
Сбор и агрегация данных:
- После получения данных из всех источников агрегировать их и отдать UI.
-
Мониторинг и метрики:
- Внедрить мониторинг времени отклика и ошибок, чтобы оперативно реагировать на деградацию.
Пример упрощённого кода на 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;
Таким образом, достигается баланс между временем отклика и нагрузкой на внешние сервисы, а также обеспечивается устойчивость к ошибкам.