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

+1 074новые вакансии за сутки·91 191вакансия открыта сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 172
  • Облачные технологии14 136
  • QA вакансии3 451
  • Backend вакансии2 051
  • Инженер данных1 762
  • Продакт-менеджер1 226

Разработка

  • Android1 854
  • iOS1 694
  • Fullstack вакансии978
  • AI вакансии944
  • Frontend вакансии735
  • Mobile вакансии43

По стеку

  • Go8 740
  • Java6 589
  • Node.js2 029
  • .NET1 734
  • Kotlin1 615
  • Rust1 473
  • C#715
  • PHP692
  • C++581

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

  • Kubernetes7 760
  • DevOps вакансии6 073
  • Linux-инфраструктура5 498
  • Terraform / IaC4 270
  • CI/CD3 273
  • Мониторинг и Observability1 791
  • SRE553
  • Кибербезопасность444

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

  • Data Scientist1 115
  • Бизнес-аналитик916
  • Аналитик данных832
  • Системный аналитик153

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

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

По регионам

  • Вакансии в США42 450
  • Вакансии в Европе23 519
  • Вакансии в Канаде4 333
  • Работа в России3 786

По формату

  • Удалённые вакансии72 089
  • Релокация в США42 450
  • Гибридная работа12 458
  • Офисная работа7 066

По уровню

  • Senior вакансии41 491
  • Middle вакансии20 265
  • Junior вакансии6 499

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

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое backpressure во flows и как Kotlin с этим справляется?

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

В Kotlin Flow backpressure решён архитектурно: emit() — suspend-функция, поэтому производитель автоматически ждёт потребителя. Для управления скоростью используются buffer(), conflate(), collectLatest(), BufferOverflow.DROP_OLDEST/DROP_LATEST.

Встроенная защита через suspension

Kotlin Flow — это cold, последовательный и suspend-based API. По умолчанию производитель не может генерировать следующий элемент, пока потребитель не завершит обработку предыдущего. Это называется sequential backpressure.

val flow = flow {
    repeat(1000) { i ->
        println("Emitting $i")
        emit(i)   // suspend до тех пор, пока collect не обработает элемент
    }
}

flow.collect { value ->
    delay(100)   // медленный потребитель — производитель автоматически замедляется
    println("Collected $value")
}

Производитель буквально приостанавливается на emit(), ожидая завершения collect. Никакого переполнения буфера нет — это ключевое отличие от callback-based подходов.

Backpressure во Flow

Backpressure — ситуация, когда производитель данных генерирует их быстрее, чем потребитель успевает обработать. В RxJava это была отдельная проблема с несколькими стратегиями. В Kotlin Flow проблема решена архитектурно через механизм suspend.

Операторы управления backpressure

buffer()

Добавляет буфер между производителем и потребителем. Производитель может опережать потребителя на capacity элементов.

flow.buffer(capacity = 64).collect { value ->
    process(value)
}
// По умолчанию capacity = Channel.BUFFERED (64 элемента)

conflate()

Потребитель всегда получает последний эмитированный элемент, промежуточные отбрасываются. Аналог RxJava onBackpressureLatest.

flow { repeat(100) { emit(it); delay(10) } }
    .conflate()
    .collect { value ->
        delay(100)         // медленный потребитель
        println(value)     // увидит только последние значения, пропуская промежуточные
    }

collectLatest()

При появлении нового элемента обработка предыдущего отменяется. Подходит для UI — обновлять интерфейс нужно только по последнему состоянию.

stateFlow.collectLatest { state ->
    // если придёт новый state, этот блок будет отменён
    render(state)
}

debounce() и sample()

// debounce: пропустить элемент, если следующий пришёл раньше timeout
userInput.debounce(300).collect { query -> search(query) }

// sample: брать не более одного элемента за период
sensorFlow.sample(1000).collect { reading -> updateChart(reading) }

Channel.UNLIMITED и DROP стратегии

// UNLIMITED — неограниченный буфер (осторожно с памятью!)
flow.buffer(Channel.UNLIMITED).collect { ... }

// DROP_OLDEST: при переполнении буфера удаляет самые старые элементы
flow.buffer(capacity = 10, onBufferOverflow = BufferOverflow.DROP_OLDEST).collect { ... }

// DROP_LATEST: при переполнении отбрасывает новый элемент
flow.buffer(capacity = 10, onBufferOverflow = BufferOverflow.DROP_LATEST).collect { ... }

SharedFlow и StateFlow

SharedFlow — hot flow с настраиваемым буфером и стратегией при переполнении. StateFlow всегда conflates — хранит только последнее значение.

val sharedFlow = MutableSharedFlow<Event>(
    replay = 0,
    extraBufferCapacity = 100,
    onBufferOverflow = BufferOverflow.DROP_OLDEST
)

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

  • buffer(Channel.UNLIMITED) без мониторинга. Если производитель работает намного быстрее потребителя, неограниченный буфер приведёт к OutOfMemoryError при долгой работе.
  • conflate() скрывает пропущенные данные. В финансовых или аудит-приложениях нельзя терять промежуточные значения. conflate() нужно применять только там, где промежуточные состояния действительно не важны.
  • collectLatest() отменяет работу. Если блок collectLatest содержит запись в БД или сетевой запрос, отмена может оставить данные в несогласованном состоянии.
  • Backpressure отсутствует для SharedFlow с DROP. Если подписчик не успевает читать из SharedFlow с DROP_OLDEST, данные теряются молча — нет никакого исключения или сигнала.
  • buffer() запускает upstream в отдельной корутине. Это меняет контекст выполнения и может привести к неожиданному поведению при использовании flowOn вместе с buffer.
  • debounce() в тестах. Без TestCoroutineScheduler с виртуальным временем debounce делает тесты медленными или ненадёжными.

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

  • Что такое structured concurrency и почему это важно?
  • В чём разница между билдерами coroutine launch и async?
  • Что такое suspend-функция и где её можно вызывать?
  • Что такое Flow в Kotlin и чем он отличается от suspend fun, возвращающей одно значение?

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

  • Объяснять «backpressure во Flow» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Без явной стратегии для быстрых событий можно либо переполнить буфер, либо потерять важные промежуточные состояния.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

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

  • Формулирует суть темы «backpressure во Flow» своими словами и связывает ее с кодом.
  • Называет механизм: По умолчанию emit suspend-ится, пока collector не обработает значение, что делает slow consumer видимым в модели.
  • Видит production-последствие: Без явной стратегии для быстрых событий можно либо переполнить буфер, либо потерять важные промежуточные состояния.

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

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

Источники

  • https://kotlinlang.org/docs/flow.html

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

Kotlin Coroutinesconcurrencyflow-backpressure-reasoningkotlin coroutines