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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 748
  • Облачные технологии6 616
  • QA вакансии2 169
  • Android1 320
  • Инженер данных872
  • Продакт-менеджер302

Разработка

  • iOS1 232
  • Backend вакансии1 204
  • AI вакансии543
  • Fullstack вакансии497
  • Frontend вакансии417
  • Mobile вакансии28

По стеку

  • Go5 212
  • Java3 116
  • Kotlin1 090
  • Node.js995
  • Rust845
  • .NET661
  • PHP320
  • C++271
  • C#208

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

  • Kubernetes3 913
  • Linux-инфраструктура2 852
  • DevOps вакансии2 678
  • Terraform / IaC2 167
  • Мониторинг и Observability1 066
  • CI/CD923
  • SRE301
  • Кибербезопасность26

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

  • Аналитик данных533
  • Data Scientist436
  • Бизнес-аналитик400
  • Системный аналитик68

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

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

По регионам

  • Вакансии в США26 186
  • Вакансии в Европе10 369
  • Работа в России3 628
  • Вакансии в Канаде2 306

По формату

  • Удалённые вакансии43 484
  • Релокация в США26 186
  • Гибридная работа5 597
  • Офисная работа4 383

По уровню

  • Senior вакансии22 724
  • Middle вакансии11 726
  • Junior вакансии3 874

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab135 вакансий
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen26 вакансий
  • Monzo19 вакансий
  • Darktrace16 вакансий

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

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

Что такое объект ApplicationCall в Ktor?

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

ApplicationCall — центральный объект одного HTTP-обмена в Ktor: через него читают запрос (call.request), отправляют ответ (call.respond) и передают данные между плагинами через call.attributes.

Передача данных через Attributes

Атрибуты — рекомендованный способ передавать контекст (например, аутентифицированного пользователя) из плагина в обработчик без глобального состояния:

// Определяем ключ один раз
val UserIdKey = AttributeKey<Long>("UserId")

// Плагин аутентификации устанавливает атрибут
val authPlugin = createApplicationPlugin("AuthPlugin") {
    onCall { call ->
        val token = call.request.headers["Authorization"] ?: run {
            call.respond(HttpStatusCode.Unauthorized)
            return@onCall
        }
        val userId = verifyToken(token)   // ваша логика
        call.attributes.put(UserIdKey, userId)
    }
}

// Route-обработчик читает атрибут
fun Application.module() {
    install(authPlugin)
    routing {
        get("/profile") {
            val userId = call.attributes[UserIdKey]
            call.respond(fetchProfile(userId))
        }
    }
}

Что такое ApplicationCall

ApplicationCall — это интерфейс в Ktor, представляющий единственный HTTP-обмен «запрос — ответ». Каждый входящий запрос порождает новый экземпляр ApplicationCall; он живёт ровно столько, сколько обрабатывается соответствующий запрос, и уничтожается после отправки ответа.

Интерфейс объявлен в пакете io.ktor.server.application и содержит три ключевых свойства:

  • call.request: ApplicationRequest — входящий запрос: метод, URI, заголовки (headers["Authorization"]), query-параметры (queryParameters["page"]), тело (receiveText(), receive<T>()).
  • call.response: ApplicationResponse — исходящий ответ: установка заголовков, статуса. Обычно управляется через call.respond().
  • call.attributes: Attributes — типизированный key-value контейнер для передачи данных между плагинами и route-обработчиками без каста через Any.

Жизненный цикл

Ktor обрабатывает каждый запрос в coroutine. Конвейер плагинов (ApplicationCallPipeline) проходит через фазы Setup, Monitoring, Features, Call, Fallback. На каждой фазе плагин получает текущий ApplicationCall через PipelineContext<Unit, ApplicationCall>. После вызова call.respond() ответ считается «завершённым» — повторный вызов бросает ResponseAlreadySentException.

Чтение тела и сериализация

@Serializable
data class CreateUserRequest(val name: String, val email: String)

fun Application.module() {
    install(ContentNegotiation) { json() }
    routing {
        post("/users") {
            // call.receive<T>() использует установленный ContentNegotiation
            val body = call.receive<CreateUserRequest>()
            val id = userService.create(body.name, body.email)
            call.respond(HttpStatusCode.Created, mapOf("id" to id))
        }
    }
}

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

  • Двойной respond. Второй вызов call.respond() в одном обработчике бросает ResponseAlreadySentException. Нужно явно завершать ветку через return после respond().
  • Тело можно прочитать только один раз. receiveChannel() или receive<T>() потребляют поток байт; повторное чтение вернёт пустые данные или ошибку без явного кэширования (receiveText() + разбор вручную).
  • Thread safety атрибутов. call.attributes не thread-safe. Не обращайтесь к ним из параллельных coroutine-контекстов без внешней синхронизации.
  • Смешение ApplicationCall с тестами. В testApplication { } используется TestApplicationCall; некоторые расширения (например, WebSocket-специфичные) недоступны в тестовом движке.
  • Неправильный статус по умолчанию. Если вызвать call.respond(someObject) без явного HttpStatusCode, Ktor ответит 200. Для ошибочных кейсов всегда передавайте статус явно.
  • Blocking в coroutine. Если внутри обработчика вызвать blocking IO (JDBC без withContext(Dispatchers.IO)), это заблокирует event loop и резко снизит throughput.
  • Отсутствие ContentNegotiation. Вызов call.receive<T>() без установленного плагина ContentNegotiation бросает UnsupportedMediaTypeException в рантайме, а не на старте.
  • call.respond vs respondText vs respondBytes. Неверный выбор метода приводит к лишней сериализации или неправильному Content-Type в ответе.

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

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

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

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

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

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

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

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

Источники

  • https://ktor.io/docs/server-routing.html

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

Ktorbackend-designktortechnical-communication