Вопрос или проблема
При работе с удалёнными или веб-API (например, REST API), могут возникнуть несколько проблем, таких как:
- Ограничение запросов и восстановление после ошибок:
Если отправлять слишком много автоматических запросов, вы можете превысить выделенную квоту или даже перегрузить сервер API, что приведёт к ошибке в обоих случаях. Вы можете справиться с этим, перехватив ошибку, подождав определённое время и повторно отправив запрос, конечно, по-прежнему потерпев неудачу после слишком большого количества попыток или определённого времени ожидания. - Постраничность:
При запросе нескольких элементов API может разрешить только ограниченный размер страницы. Например, вы должны отправить несколько запросов, используя увеличивающийся размер страницы, а затем объединить результаты в полный список элементов. - Ограничения временного интервала:
Аналогично постраничности, API может разрешать запрашивать элементы только за ограниченный временной период (например, созданные в течение трёх месяцев). Например, вы должны создать несколько временных интервалов и объединить результаты в полный список элементов.
Обычно эти проблемы не решаются вспомогательными библиотеками, которые могут быть доступны для языка программирования/платформы.
До сих пор я писал код для решения этих проблем самостоятельно, но так как они встречаются повсеместно, я задумался, существуют ли библиотеки, которые могут помочь в их решении, предпочтительно для Java Virtual Machine (в идеале, специально для языка Kotlin).
Ключевое слово для поиска библиотек для ограничения запросов и восстановления после ошибок — resilience.
Существуют несколько библиотек для этого, например:
- Resilience4j (Java плюс некоторая дополнительная поддержка для Kotlin)
- Sentinel (Java)
- Множество частей Spring, например spring-retry и Spring Cloud Circuit Breaker (Java)
- Failsafe (Java)
Ответ или решение
При работе с удаленными или веб-API (например, REST API) перед разработчиками часто встают сложные задачи, такие как:
-
Ограничение скорости и восстановление после ошибок: При отправке большого количества автоматических запросов вы можете превысить выделенную вам квоту или перегрузить сервер API, что приведет к ошибке. Для решения этой проблемы необходимо обрабатывать ошибки, приостанавливать выполнение на определенное время и повторять запросы, при этом важно установить предельное количество попыток или временной лимит.
-
Пагинация: При запросе множества элементов, API может ограничивать размер страницы. Это означает, что вам придётся отправлять несколько запросов с увеличивающимся параметром страницы и объединять результаты в полный список элементов.
-
Ограничения по временному промежутку: Совместим с пагинацией, API может позволять запрашивать элементы только в рамках ограниченного временного интервала (например, созданные в течение трёх месяцев). Здесь необходимо разбивать запросы на временные интервалы и объединять все результаты в общий список.
Обычно, указанные проблемы не решаются обёрточными библиотеками, которые могут быть доступны для языка программирования или платформы.
Если вы разрабатываете на платформе Java Virtual Machine и, в частности, используете Kotlin, для решения вышеуказанных проблем существуют библиотеки, обеспечивающие устойчивость и возможность восстановления. Вот некоторые из них:
-
Resilience4j: Это специализированная библиотека для Java и Kotlin, предоставляющая набор инструментов для создания устойчивых приложений. Она предлагает реализацию шаблонов для управления отказами, таких как ограничение скорости и автоматическое повторное выполнение операций.
-
Sentinel от Alibaba: Эта библиотека для Java предназначена для управления квотами и отказоустойчивостью распределенных сервисов, обеспечивая защиту от перегрузки и автоматический контроль за пределами допустимых значений.
-
Spring и его компоненты: Если вы используете Spring Framework, стоит обратить внимание на такие модули, как
spring-retry
для повторных попыток иSpring Cloud Circuit Breaker
для управления отказами сети и устойчивости API. -
Failsafe: Это ещё одна библиотека для Java, которая предоставляет интуитивно понятные API и инструменты для обработки ошибок, ретрайов и выполнения задач с учетом времени ожидания.
Эти библиотеки помогут вам эффективно решать распространенные проблемы, связанные с работой удаленных API, такие как пагинация, ограничения по времени и восстановление после ошибочных запросов. Выбрав подходящую библиотеку, вы сможете значительно улучшить надежность и устойчивость ваших приложений.