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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

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

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

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

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

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

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

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

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

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое pipeline-система в Ktor и как происходит обработка запроса?

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

Pipeline в Ktor — упорядоченный набор фаз (Setup, Monitoring, Plugins, Call, Fallback), через которые проходит ApplicationCall. Каждая фаза содержит интерсепторы; proceed() передаёт управление дальше, finish() прерывает цепочку.

Путь запроса через pipeline

// Схема: входящий запрос -> ApplicationCallPipeline
// Setup -> Monitoring -> Plugins -> Call -> Fallback
// Внутри Call -> RoutingPipeline -> конкретный маршрут
// Ответ -> ApplicationSendPipeline

Pipeline-система Ktor: концепция

Pipeline — центральный механизм обработки в Ktor. Это упорядоченный список фаз (PipelinePhase), через которые последовательно проходит объект субъекта (например, ApplicationCall). Каждая фаза содержит интерсепторы — suspending-функции, которые могут выполнить логику, модифицировать субъект или досрочно завершить обработку через finish().

ApplicationCallPipeline: фазы

Серверный pipeline для обработки HTTP-запроса имеет пять фаз в порядке выполнения:

  • Setup — инициализация, подготовка контекста
  • Monitoring — логирование, трассировка, метрики (CallLogging работает здесь)
  • Plugins (ранее Features) — бизнес-плагины: Authentication, Sessions, CORS
  • Call — маршрутизация и обработчики маршрутов
  • Fallback — обработка незавершённых вызовов (404)

Добавление интерсептора к фазе

import io.ktor.server.application.*
import io.ktor.server.request.*

fun Application.configurePipeline() {
    // Перехват на фазе Monitoring для всех вызовов
    intercept(ApplicationCallPipeline.Monitoring) {
        val start = System.currentTimeMillis()
        try {
            proceed()  // передать управление следующим интерсепторам
        } finally {
            val duration = System.currentTimeMillis() - start
            application.log.info("${call.request.uri} completed in ${duration}ms")
        }
    }

    // Перехват на фазе Plugins (до маршрутизации)
    intercept(ApplicationCallPipeline.Plugins) {
        val token = call.request.headers["X-API-Token"]
        if (token == null) {
            call.respond(io.ktor.http.HttpStatusCode.Unauthorized, "Missing token")
            return@intercept finish()  // остановить pipeline
        }
        proceed()
    }
}

Создание собственного плагина через Pipeline

import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.util.*

val RequestIdPlugin = createApplicationPlugin("RequestId") {
    onCall { call ->
        // onCall = интерсептор фазы Call
        val requestId = call.request.headers["X-Request-Id"]
            ?: java.util.UUID.randomUUID().toString()
        // Сохранить в атрибутах call для downstream-доступа
        call.attributes.put(RequestIdKey, requestId)
    }
}

val RequestIdKey = AttributeKey<String>("RequestId")

// Использование
fun Application.configurePlugins() {
    install(RequestIdPlugin)
}

RoutingPipeline: фазы маршрутизации

import io.ktor.server.routing.*

fun Application.configureRouting() {
    routing {
        // Интерсепция на уровне routing-pipeline
        intercept(RoutingRoot.PLUGIN_REGISTRY.first()) {
            proceed()
        }

        route("/api") {
            // Интерсептор для подгруппы маршрутов
            intercept(RoutingPhase) {
                // Проверка авторизации для всей группы /api
                proceed()
            }

            get("/users") {
                call.respondText("users list")
            }
        }
    }
}

ApplicationSendPipeline

После обработчика маршрута ответ проходит через ApplicationSendPipeline с фазами: Before, Transform, Render, ContentEncoding, TransferEncoding, After. Плагин ContentNegotiation работает в фазе Render, сериализуя объекты в JSON/XML.

Порядок регистрации имеет значение

// Неверно: Authentication должна стоять до бизнес-плагинов
install(MyPlugin)
install(Authentication)  // слишком поздно

// Верно:
install(Authentication)
install(MyPlugin)

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

  • Вызов proceed() без return@intercept после finish() продолжит выполнение кода интерсептора — всегда используйте return@intercept finish() для полной остановки.
  • Исключение внутри intercept { } без try/catch обходит StatusPages-плагин, если не настроена обработка в нужной фазе — добавляйте перехват в Monitoring с try/finally.
  • Порядок install() важен: плагины встраиваются в pipeline в порядке установки; CORS перед Authentication — иначе preflight получит 401.
  • Интерсепторы в routing-pipeline выполняются заново для каждого вложенного маршрута при RoutingResolve — не добавляйте тяжёлую логику в intercept routing без фильтрации.
  • call.attributes.put() — потокобезопасный способ передачи данных между фазами; прямое использование внешних переменных внутри интерсептора может привести к race condition при параллельных запросах.
  • В Ktor 2.x плагины создаются через createApplicationPlugin/createRouteScopedPlugin; старый API ApplicationFeature удалён — код из туториалов под Ktor 1.x не скомпилируется.
  • Фаза Fallback вызывается только если ни один маршрут не завершил вызов; если маршрут существует, но бросает исключение, Fallback не срабатывает — нужен StatusPages.
  • Нельзя добавить интерсептор к фазе, которой нет в данном pipeline — например, серверная фаза Call недоступна в клиентском pipeline, попытка вызовет InvalidPhaseException.

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

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

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

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

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

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

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

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

Источники

  • https://ktor.io/docs/server-plugins.html
←Предыдущий вопросЧто такое Ktor и каковы его ключевые преимущества перед другими Kotlin-фреймворками?Следующий вопрос→В каких backend-проектах Ktor является сильным выбором, а где лучше выбрать более простой или другой стек?

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

Ktorbackend-designktortechnical-communication