Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+687новых вакансий за сутки·55 254вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 791
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python7 042
  • Облачные технологии5 085
  • QA вакансии1 814
  • Android1 199
  • Инженер данных831
  • Продакт-менеджер339

Разработка

  • iOS1 135
  • Backend вакансии1 131
  • Fullstack вакансии475
  • AI вакансии458
  • Frontend вакансии404
  • Mobile вакансии27

По стеку

  • Go4 093
  • Java2 435
  • Kotlin990
  • Node.js827
  • Rust665
  • .NET525
  • PHP282
  • C++223
  • C#199

DevOps и инфраструктура

  • Kubernetes2 931
  • Linux-инфраструктура2 312
  • DevOps вакансии2 110
  • Terraform / IaC1 714
  • CI/CD872
  • Мониторинг и Observability825
  • SRE253
  • Кибербезопасность50

Аналитика и данные

  • Аналитик данных497
  • Data Scientist463
  • Бизнес-аналитик374
  • Системный аналитик54

Другие направления

  • Проджект-менеджер119
  • UI/UX дизайн72
  • Ручное тестирование14

По регионам

  • Вакансии в США25 531
  • Вакансии в Европе9 792
  • Работа в России3 193
  • Вакансии в Канаде2 236

По формату

  • Удалённые вакансии43 578
  • Релокация в США25 531
  • Гибридная работа4 289
  • Офисная работа3 340

По уровню

  • Senior вакансии21 650
  • Middle вакансии12 211
  • Junior вакансии3 886

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise125 вакансий
  • Celonis28 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen17 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме KtorВсе вопросы
KtorMiddleТеория

Что такое плагин HttpRequestRetry и как настраивать логику повторных попыток?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

HttpRequestRetry — плагин Ktor Client, автоматически повторяющий запросы при сетевых ошибках или 5xx; настраивается через retryOnServerErrors(), retryIf{}, exponentialDelay() и modifyRequest{}; по умолчанию не повторяет POST-запросы во избежание дублирования.

Минимальная настройка

val client = HttpClient(CIO) {
    install(HttpRequestRetry) {
        retryOnServerErrors(maxRetries = 3)
        exponentialDelay()
    }
}

retryOnServerErrors повторяет запрос при HTTP 500–599. exponentialDelay() задаёт задержку по формуле base * 2^attempt + jitter, где по умолчанию base = 0.5 с, max = 60 с.

Что такое HttpRequestRetry

HttpRequestRetry — плагин Ktor HTTP Client (артефакт io.ktor:ktor-client-core, подключается через install(HttpRequestRetry)), реализующий автоматические повторные попытки при ошибках сети или серверных ответах 5xx. Плагин работает на уровне конвейера клиента и прозрачен для кода вызова.

Полная конфигурация с объяснением ключей

install(HttpRequestRetry) {
    // Максимальное число повторных попыток (не считая оригинальный запрос)
    maxRetries = 5

    // Условие: повторять при IOException (сеть оборвалась)
    retryOnException(maxRetries = 5, retryOnTimeout = true)

    // Условие: повторять при 429, 500, 502, 503, 504
    retryIf { _, response ->
        response.status.value.let { it == 429 || it in 500..504 }
    }

    // Задержка: экспоненциальная с jitter
    exponentialDelay(
        base = 2.0,          // множитель (секунды)
        maxDelayMs = 30_000L, // не более 30 секунд
        randomizationMs = 500L // ±500 мс jitter
    )

    // Кастомный delay — например, уважать Retry-After заголовок
    delayMillis { retry ->
        val retryAfter = response?.headers?.get(HttpHeaders.RetryAfter)
            ?.toLongOrNull()?.times(1000)
        retryAfter ?: (1000L * (1 shl retry)) // fallback exponential
    }

    // Изменить запрос перед повтором (например, обновить токен)
    modifyRequest { request ->
        request.headers.remove(HttpHeaders.Authorization)
        request.headers.append(
            HttpHeaders.Authorization,
            "Bearer ${tokenStore.getFreshToken()}"
        )
    }
}

Идемпотентность: когда повторять безопасно

По умолчанию плагин повторяет только идемпотентные методы (GET, HEAD, OPTIONS, PUT, DELETE). POST и PATCH не повторяются автоматически, чтобы избежать дублирования данных. Для явного разрешения POST:

install(HttpRequestRetry) {
    maxRetries = 3
    retryIf { request, response ->
        // Только если сервер явно сигнализирует о повторяемости
        request.method == HttpMethod.Post &&
            response.status == HttpStatusCode.ServiceUnavailable
    }
    exponentialDelay()
}

Мониторинг попыток

install(HttpRequestRetry) {
    retryOnServerErrors(maxRetries = 3)
    exponentialDelay()

    // Коллбэк после каждой попытки
    retryIf { request, response ->
        val shouldRetry = !response.status.isSuccess()
        if (shouldRetry) {
            application.log.warn(
                "Retry attempt for ${request.url}: ${response.status}"
            )
        }
        shouldRetry
    }
}

Интеграция с CircuitBreaker (Resilience4j)

HttpRequestRetry хорошо сочетается с паттерном circuit breaker: retry пробует несколько раз, circuit breaker отрубает поток при систематических ошибках.

val circuitBreaker = CircuitBreakerRegistry.ofDefaults()
    .circuitBreaker("payment-service")

suspend fun callPaymentApi(request: PaymentRequest): PaymentResponse {
    return circuitBreaker.executeSuspendFunction {
        httpClient.post("https://payments.example.com/charge") {
            contentType(ContentType.Application.Json)
            setBody(request)
        }.body()
    }
}

Подводные камни

  • POST-запросы не повторяются по умолчанию — если ваш API принимает POST для идемпотентных операций (например, GET через POST из-за большого тела), нужно явно разрешать повторы через retryIf.
  • Тело запроса потребляется: при повторе с ByteArray-телом Ktor корректно буферизует его, но если тело задано как Flow или Channel — повтор невозможен без явной буферизации.
  • Retry-After в секундах vs дата: заголовок Retry-After может быть как числом секунд, так и HTTP-датой — парсить нужно оба формата, иначе получите NumberFormatException.
  • Суммарное время ожидания: 5 попыток с экспоненциальным delay могут занять > 60 с суммарно — добавляйте общий таймаут на уровне клиента через install(HttpTimeout).
  • Конфликт с HttpTimeout: если таймаут одного запроса меньше суммы всех задержек retry — плагин будет прерываться досрочно; согласовывайте значения.
  • 429 и Retry-After: без явного чтения заголовка Retry-After в delayMillis сервер будет получать повторы слишком быстро и продолжит отвечать 429.
  • modifyRequest и изменяемые данные: если modifyRequest обращается к внешнему токен-стору, убедитесь, что он thread-safe и не вызывает блокирующий ввод-вывод вне Dispatchers.IO.

Частые вопросы на собеседовании

  • Какие security-риски возникают в Ktor при CORS, JWT/session auth и обработке multipart-загрузок?
  • Каковы варианты production-деплоя приложения Ktor?
  • Как определять маршруты (routes) в Ktor и как работает вложенная маршрутизация?
  • Что такое plugins (ранее features) в Ktor и как их устанавливать?

Типичные ошибки

  • Путать термин «http request retry» с соседним механизмом Ktor.
  • Не называть границу lifecycle, transaction, thread или request для «http request retry».
  • Игнорировать production-эффекты «http request retry»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «http request retry» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «http request retry».
  • Уточнить, какие настройки или API меняют «http request retry» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Ktor →

Источники

  • https://ktor.io/docs/client-request-retry.html

Связанные темы

Ktorbackend-designktortechnical-communication