Вопросы на собеседовании: Node.js-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Senior Node.js-разработчик.
Смотреть пример резюме: Node.js-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Я бы сохранил единый deployment, но сделал каждый модуль отдельно контролируемой границей владения в коде и доступе к данным.
- Order, Inventory и Billing открывали бы узкие TypeScript entry points, а package exports, project references и правила dependency-cruiser или ESLint запрещали бы импорт внутренних файлов.
- Каждый модуль владел бы своими таблицами PostgreSQL и repository; другой модуль вызывает публичный API вместо одной из 7 прямых записей или join по закрытым таблицам в коде приложения.
- CI ломался бы на любом из 18 запрещённых рёбер зависимостей, запускал contract tests публичных entry points и публиковал граф зависимостей, чтобы размывание границ было видно до merge.
- Межмодульная работа, которой нужна одна транзакция базы, шла бы через явный application coordinator и API модулей, а некритичные побочные эффекты через типизированные in-process events с назначенными владельцами.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат сохранять модульное владение через контролируемые границы Node.js и базы, не приравнивая модульность к сетевым сервисам.
Я дам Order и Inventory раздельное владение и заменю общую транзакцию явным процессом резервирования товара.
- Order владеет состоянием и суммой заказа, а Inventory единолично владеет доступным количеством и резервом с ID заказа и сроком жизни 10 минут.
- Checkout создаёт заказ в статусе Pending, отправляет ReserveStock с ID заказа и подтверждает его только после долговечного резерва от Inventory, поэтому ни один сервис не пишет в таблицы другого контекста.
- Отклонённый или истёкший резерв отменяет Pending-заказ, а повторные команды резерва и освобождения используют тот же ID заказа и ограничение уникальности.
- Если бизнес требует создать заказ и уменьшить остаток за 1 атомарный шаг без статуса Pending, я оставлю этот инвариант в 1 контексте вместо внедрения 2PC.
Зачем это спрашивают: Интервьюер проверяет, выводит ли кандидат границы из владения данными и инвариантов вместо сохранения общей междоменной транзакции.
Я оставлю синхронными решения, нужные для ответа покупателю, а работу после подтверждения опубликую в Kafka.
- Браузер использует HTTP JSON, а внутренние pricing, inventory и payment могут использовать gRPC, если уже есть сгенерированные Protobuf-контракты; одна смена протокола не исправит плохой бюджет задержки.
- Я выделю около 50 мс на edge и приложение, 80 мс на pricing, 120 мс на inventory, 180 мс на payment и сохраню 70 мс на сетевой разброс и сериализацию.
- После коммита заказа transactional outbox публикует OrderConfirmed в Kafka в пределах 1 секунды для доставки, письма и аналитики, которые не должны расходовать бюджет ответа в 500 мс.
- Если payment не укладывается в свои 180 мс, я верну результат Pending и закончу процесс асинхронно вместо синхронной цепочки, регулярно превышающей 500 мс.
Зачем это спрашивают: Интервьюер проверяет, связывает ли кандидат способ коммуникации с видимой пользователю семантикой процесса и числовым бюджетом задержки.
Я оставлю единые пограничные контроли в gateway, а авторизацию на уровне ресурса выполню в сервисе, владеющем заказом.
- Gateway завершает TLS, проверяет подпись JWT по кешированному JWKS, маршрутизирует запросы, ограничивает body значением 2 МБ, применяет лимиты по клиенту и пишет низкокардинальные метрики трафика.
- При 100 000 RPS реплики gateway должны быть stateless и не обращаться к базе пользователей или политик на каждый запрос; кешированные ключи и локальная проверка токена сохраняют масштабируемость edge-слоя.
- Gateway может потребовать scope orders:read, но Order-сервис по актуальным доменным данным проверяет, владеет ли пользователь заказом 8472 или имеет tenant-specific право поддержки.
- Я не помещу в gateway оркестрацию checkout, переходы состояния заказа или специфичное для сервиса преобразование ответа, потому что уже 3 такие функции создадут связанное узкое место деплоя.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат отделить масштабируемую пограничную политику от решений авторизации, которым нужно авторитетное состояние домена.
Я бы использовал Kubernetes для discovery и балансировал на уровне gRPC streams, а не по числу TCP connections.
- Service вместе с EndpointSlices или xDS открывает 40 готовых pods, а клиенты держат несколько HTTP/2 channels и применяют round robin по разрешённым endpoints вместо одного закреплённого через DNS канала.
- L7 gRPC proxy должен выбирать upstream по активным requests или streams, а не по наименьшему числу TCP connections, потому что одно соединение может нести тысячи из 80 000 одновременных streams.
- Readiness исключает pod из нового выбора endpoints, но не запрещает новые streams в уже открытом channel; drain также должен вызвать server.tryShutdown в grpc-js или отправить GOAWAY и отклонить новые вызовы.
- Я бы дал 60 секунд на кооперативное завершение streams, затем выполнил force shutdown, а максимальный возраст соединения с jitter постепенно обновлял распределение channels без синхронного переподключения всех клиентов.
Зачем это спрашивают: Интервьюер проверяет понимание того, что Kubernetes обновляет обнаруженные endpoints, но не перераспределяет уже установленные долгоживущие соединения.
Я использую оркестрируемую сагу с долговечным состоянием, потому что 4 упорядоченным шагам и их компенсациям нужна одна видимая запись процесса.
- Оркестратор сохраняет ID checkout, текущий шаг, число попыток и дедлайн 15 минут, затем отправляет каждую команду через outbox после коммита своей локальной транзакции.
- При сбое он компенсирует в обратном порядке: отменяет доставку, аннулирует авторизацию платежа, освобождает товар и переводит заказ в Cancelled.
- Каждая прямая и компенсирующая команда использует ключ вроде checkout-482:reserve-stock, а сервис атомарно записывает его со своим локальным изменением до подтверждения.
- При таймауте временный сбой повторяется не более 3 раз, после чего сага переходит в ManualReview, если компенсацию вроде аннулирования платежа подтвердить не удалось.
Зачем это спрашивают: Интервьюер проверяет, рассматривает ли кандидат сагу как долговечный конечный автомат с явными идемпотентными бизнес-компенсациями.
Я проведу единую стабильную идентичность операции через все 3 сервиса и дам каждому побочному эффекту свой детерминированный дочерний ключ.
- Checkout до начала работы сохраняет tenant ID, endpoint, ключ идемпотентности, SHA-256 fingerprint запроса, состояние и ответ под ограничением уникальности.
- Он выводит отдельные ключи вроде key-731:payment и key-731:shipment, поэтому все 4 повтора приходят в те же downstream-операции, не смешивая 2 разных эффекта.
- Каждый сервис захватывает свой ключ и применяет бизнес-изменение в 1 локальной транзакции; конкурентный дубликат получает сохранённый результат или ответ 202 Pending.
- Я храню ключи 7 дней, дольше окон HTTP-ретраев и повторного чтения сообщений, а тот же ключ с другим fingerprint отклоняю как конфликт 409.
Зачем это спрашивают: Интервьюер проверяет, обрабатывает ли кандидат конкурентные повторы, несовпадение данных и разные downstream-эффекты через границы сервисов.
Я сначала расширю provider, независимо переведу 12 потребителей и сожму контракт только после доказанного телеметрией отказа от старого поля.
- На 1-й неделе provider принимает customerName или новое структурированное поле customer, возвращает оба представления и нормализует их в 1 доменную модель на границе API.
- Consumer-driven contract tests проверяют обе формы в CI, а каждый запрос записывает ID потребителя и версию контракта, чтобы незарегистрированный клиент не исчез из подсчёта миграции.
- Я буду переводить примерно по 2 потребителя в неделю без синхронного релиза, опубликую сгенерированный клиент для новой формы и сохраню совместимость expanded-provider с откатом.
- После миграции всех 12 потребителей и 0 обращений к старому полю в течение 14 дней я перестану его возвращать, а приём и adapter-код удалю в следующем релизе.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат провести ломающую смену API через независимые деплои и удалить старый контракт на основе данных.
Я помещу всю политику устойчивости внутрь 600 мс, а не дам каждой попытке независимый таймаут.
- Я зарезервирую 100 мс на работу приложения, 120 мс на базу, 80 мс на разброс ответа и отдам зависимости не более 300 мс суммарно.
- При измеренном p99 зависимости около 90 мс я начну с таймаута попытки 140 мс и разрешу 1 повтор после jitter до 20 мс только для идемпотентных вызовов и временных ошибок.
- Переданный дальше дедлайн отменяет downstream-работу, а повтор не начинается, если осталось меньше 160 мс, поэтому истёкший запрос не создаёт бесполезную фоновую нагрузку.
- Я начну с размыкания breaker при 50% подходящих ошибок минимум в 20 вызовах, открою его на 5 секунд, разрешу 2 half-open проверки и настрою числа по трафику, а не догадкам.
Зачем это спрашивают: Интервьюер проверяет, объединяет ли кандидат таймауты, ретраи и поведение breaker в одном числовом сквозном дедлайне.
Я изолирую ёмкость рекомендаций от основного пути товара и уберу рекомендации до того, как они исчерпают 60 соединений базы.
- Основные чтения товара сохраняют пул PostgreSQL на 60 соединений, а рекомендации получают отдельный HTTP agent на 20 sockets, лимит конкурентности 40 и ограниченную очередь на 80 запросов.
- Опциональный вызов получает таймаут 80 мс без ретрая внутри запроса; при сбое API возвращает товар с recommendationStatus unavailable или значение Redis не старше 5 минут.
- После заполнения 80 мест опциональной очереди новые рекомендации сразу пропускаются, поэтому 12 000 RPS не превращают медленную зависимость в неограниченные promises и рост heap.
- Я отдельно построю графики основной latency, пропущенных рекомендаций, глубины очереди, использования sockets и возраста stale-кеша, затем под нагрузкой проверю, что сбой рекомендаций не поднимает p95 товара выше 250 мс.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат резервировать конкретные пулы ресурсов и задавать безопасный видимый fallback для опциональной зависимости.
Я запущу 18 одноядерных процессов-реплик, по шесть на каждом из трёх 8-ядерных хостов; при 24 000 RPS каждая обычно обслуживает около 1 333 RPS, а после потери хоста нагрузка вырастает до 2 000 RPS.
- Один JavaScript event loop использует одно ядро для кода приложения, поэтому остальные ядра задействуют дополнительные процессы, а не увеличение одного процесса.
- Цель в 2 000 RPS составляет 67% от измеренного предела в 3 000 RPS и оставляет запас для event loop и всплесков трафика.
- После потери одного хоста останутся 12 реплик и ровно 24 000 RPS плановой ёмкости, а два свободных ядра на хосте останутся ОС и нативной работе.
- Я вынесу состояние наружу и проведу нагрузочный тест базы, кеша, пулов соединений и сети на 36 000 RPS, потому что ёмкость процессов не равна сквозной ёмкости.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат превратить бенчмарк одного процесса в модель ёмкости N+1 и не предполагает ли, что один event loop использует все восемь ядер.
Обычно я выберу 24 pod с одним процессом и запросом 1 vCPU вместо четырёх cluster workers внутри каждого из шести pod.
- Kubernetes сможет независимо размещать, проверять, перезапускать и дренировать каждый процесс, а не считать четыре границы памяти и отказа одним pod.
- CPU, RSS, задержка event loop и readiness одного pod тогда описывают один процесс Node.js, поэтому лимиты и сигналы автоскейлинга проще интерпретировать.
- Rolling update может заменять несколько из 24 процессов за раз, тогда как замена одного pod с cluster одновременно убирает четыре процесса.
- Я оставлю cluster для отдельной 4-ядерной VM или платформы без оркестрации процессов и задокументирую исключение, если sidecar или другие ресурсы каждого pod необычно дороги.
Зачем это спрашивают: Интервьюер проверяет, разделяет ли кандидат использование ядер одного хоста и управление размещением и жизненным циклом средствами Kubernetes.
Для WebSocket upgrade я выберу взвешенный least-connections, а для короткого HTTP-трафика least-outstanding-requests или round robin.
- Least-connections направляет новый upgrade на реплику с меньшим числом открытых сокетов и удерживает ожидаемые 5 000 соединений на реплику ниже измеренного лимита в 6 000.
- Я не позволю 20 000 долгим соединениям определять выбор для HTTP, поэтому балансировщику нужны отдельные счётчики или backend pools для upgrade и обычных запросов.
- Веса позволяют сократить трафик на меньшую или прогревающуюся реплику, а consistent hashing не нужен без явного требования к локальности после выноса состояния.
- Readiness должна запретить новые upgrade до дренирования реплики, а существующие сокеты остаются на ней до закрытия или ограниченного дедлайна деплоя.
Зачем это спрашивают: Интервьюер оценивает, соответствует ли алгоритм двум нагрузкам с разным временем жизни соединений, а не применяет ли кандидат один round robin к обеим.
Я не буду использовать sticky routing для HTTP, вынесу сессии и сообщения наружу и оставлю привязку только для WebSocket на время открытого соединения.
- Непрозрачный session ID может ссылаться на состояние в Redis с TTL 30 минут, поэтому любой из шести экземпляров сможет аутентифицировать следующий HTTP-запрос.
- Общий реестр соединений и разделённый pub-sub направят сообщение на реплику с нужным сокетом при среднем значении 10 000 сокетов на реплику.
- Привязка по cookie или исходному IP может скрыть состояние в памяти, но создаёт перекос нагрузки и теряет непрерывность при замене выбранного pod во время rollout.
- Клиенты должны переподключаться с jitter и resume cursor, чтобы безопасно перенести соединение без сохранения памяти старого процесса.
Зачем это спрашивают: Интервьюер проверяет, отличает ли кандидат неизбежное время жизни открытого сокета от долговечной привязки сессии.
Оставшиеся 25 мс я разделю на 10 мс ожидания event loop, 10 мс работы приложения и 5 мс запаса, ограничив любую непрерывную синхронную часть 5 мс.
- При 400 RPS синхронная работа по 1,5 мс требует около 600 мс одного ядра в секунду, поэтому процесс начинает примерно с 60% event-loop utilization без учёта callbacks и GC.
- Я буду записывать monitorEventLoopDelay как гистограмму и потребую, чтобы её p99 оставался ниже выделенных 10 мс под реальной смесью запросов.
- Я сравню снимки eventLoopUtilization по окнам нагрузки и буду исследовать устойчивые значения выше примерно 70%, а не считать одно накопленное значение метрикой запроса.
- CPU profiles найдут части дольше 5 мс, которые я ограничу, разобью планируемыми уступками event loop или перенесу в worker pool перед повторной проверкой p99 в 120 мс.
Зачем это спрашивают: Интервьюер проверяет, выводит ли кандидат измеримый синхронный бюджет из цели задержки и интерпретирует ли event-loop delay вместе с utilization.
Я запущу шесть worker threads на pod, не менее двух реплик и буду передавать владение каждым ArrayBuffer размером 8 MiB вместо клонирования.
- Шесть workers дают теоретические 150 задач в секунду, а цель загрузки 70% даёт около 105 задач в секунду и оставляет CPU основному event loop и нативной работе.
- Две реплики дают около 210 задач в секунду на целевой загрузке, а ограниченная входная очередь должна отклонять или откладывать работу сверх этого темпа.
- Transfer перемещает backing store ArrayBuffer и отсоединяет его у отправителя, тогда как clone для 200 входов в секунду копировал бы около 1,6 GiB в секунду ещё до ответов.
- Если отправителю нужны исходные байты, я сделаю копирование явным или спроектирую синхронизированный протокол SharedArrayBuffer, затем вместе измерю вычисления, обмен сообщениями, RSS и p99.
Зачем это спрашивают: Интервьюер оценивает, следует ли размер пула из расчёта CPU и учитывает ли кандидат стоимость перемещения данных и семантику владения.
Я начну с UV_THREADPOOL_SIZE=4, ограничу получение ключей тремя конкурентными операциями на реплику и проведу бенчмарк до увеличения пула.
- Криптографическая нагрузка потребляет около 2,4 ядро-секунды в секунду на реплику, поэтому большой пул не создаст дополнительный CPU при лимите 4 vCPU.
- Три конкурентные операции по 40 мс дают теоретические 75 в секунду и оставляют один слот пула для файловой системы, dns.lookup, zlib и другой общей работы libuv.
- Размер 4 создаёт 48 потоков libuv на 12 репликах, тогда как значение 16 создаст 192 потока и может добавить переключения контекста и память без полезного throughput.
- Я сравню размеры 4, 6 и 8 по времени в очереди crypto, p99 файловой системы, CPU и RSS и вынесу работу с паролями в отдельные реплики, если общий пул всё ещё нарушает любой SLO.
Зачем это спрашивают: Интервьюер проверяет, учитывает ли кандидат общих потребителей пула, лимиты CPU и умножение числа потоков каждого процесса на весь fleet.
Цепочка microtasks не даёт выполняться фазам timers и I/O, потому что Node.js продолжает опустошать очередь microtasks до перехода event loop дальше.
- Promise.then и queueMicrotask планируют новые microtasks, поэтому замена рекурсии одним из этих API не уступает event loop; рекурсивный process.nextTick ещё агрессивнее, поскольку его очередь выполняется раньше обычных promise microtasks.
- Я бы обрабатывал измеренную часть, например 500 элементов, сохранял cursor и ждал setImmediate из node:timers/promises перед следующей частью, чтобы timers и poll callbacks получили время.
- Если 100 000 шагов выполняют тяжёлые CPU-вычисления, а не короткую координацию, я бы отправил batch в ограниченный пул worker_threads вместо создания ещё более длинной последовательности проходов event loop.
- Нагрузочный тест отслеживал бы p99 monitorEventLoopDelay, eventLoopUtilization, опоздание timers, throughput и глубину очереди и сохранял размер части только при выполнении бюджета таймера 10 мс.
Зачем это спрашивают: Интервьюер проверяет, отличает ли кандидат завершение microtasks от уступки event loop и умеет ли ограничить задержку вместе с общим расходом CPU.
Я начну с --max-old-space-size=1024, буду считать полный лимит 2 GiB бюджетом реплики, размещу не более шести таких pod на узле 16 GiB и сниму heap snapshots только на изолированной диагностической реплике.
- Для ёмкости важен RSS, потому что он включает heap V8, Buffers, нативные аллокации, код и стеки потоков; измеренный пик 1,6 GiB оставляет лишь около 400 MiB до лимита pod.
- Шесть лимитов по 2 GiB резервируют 12 GiB и оставляют 4 GiB операционной системе, Kubernetes, служебным процессам и временному давлению на узел.
- Snapshot может остановить event loop и потребовать много дополнительной памяти, поэтому я выведу реплику из трафика и дам диагностическому pod не менее 3 GiB вместо риска OOM в продакшн-pod на 2 GiB.
- Я сравню прогретые post-GC snapshots по retained size и retaining path, затем проверю исправление по наклону RSS, времени GC и soak test, а не только увеличу heap limit.
Зачем это спрашивают: Интервьюер оценивает, отделяет ли кандидат heap от RSS и учитывает ли накладные расходы snapshot и запас узла при планировании ёмкости.
Я бы позволил балансировщику первым закрывать idle connections, отдельно ограничил медленную загрузку запроса и обеспечил 2-секундный бюджет handler через отмену.
- Я бы задал server.keepAliveTimeout около 55 секунд, чтобы балансировщик, владеющий и повторно использующий клиентскую сторону upstream-соединения, закрывал его на 50-й секунде раньше server-side idle timeout Node.js.
- Я бы начал с headersTimeout 10 секунд и requestTimeout 20 секунд на полный запрос до 2 МиБ, добавив лимиты числа headers и размера body, чтобы медленные клиенты не занимали parsers бесконечно.
- Route использовал бы AbortController с дедлайном меньше 2 секунд и передавал signal в fetch, получение соединения базы и потоковую работу, потому что socket timeouts сервера не отменяют promises приложения автоматически.
- Я бы согласовал настройки client agent и proxy в нагрузочном тесте и отслеживал connection resets, ответы 408, активные sockets, reuse rate и p99 до изменения значений 55, 10 или 20 секунд.
Зачем это спрашивают: Интервьюер проверяет, разделяет ли кандидат переиспользование idle connections, защиту от медленных клиентов и отмену приложения вместо одного timeout для всех трёх задач.
Закрытые вопросы
- 21
Kafka получает 50 000 событий в секунду с retention семь дней, и 2% должны стать задачами BullMQ ровно через 10 минут. Как передать отложенное подмножество без потери или дублирования бизнес-эффекта?
retentionkafka - 22
Топик Kafka получает 50 000 записей в секунду, а одна партиция обрабатывает 2 000 записей в секунду. Сколько партиций и потребителей вы запланируете с сохранением порядка по клиенту?
partitioningkafkaconcurrency - 23
Node.js-потребитель Kafka применяет 20 000 платёжных событий в секунду к PostgreSQL. Объясните окно сбоя при at-least-once и способ получить effectively-once результат.
postgreskafka - 24
8 Node.js-потребителей одновременно получают одно событие. Как сделать consumer атомарным и идемпотентным с помощью ограничения уникальности PostgreSQL?
concurrencyidempotencypostgres - 25
Спроектируйте transactional outbox для Node.js-сервиса с 5 000 записей PostgreSQL в секунду и сохранением порядка событий по счёту.
transactionspostgresdesign - 26
Спроектируйте retry topics, backoff и dead-letter queue для задач, которые должны успешно завершиться или попасть в DLQ в пределах SLA 45 минут.
designresiliencedata-structures - 27
Очередь получает 10 000 задач в секунду, средняя обработка занимает 50 миллисекунд, возраст старейшей задачи должен быть меньше 180 секунд, а backlog равен 600 000. Как задать concurrency и backpressure?
concurrencydata-structuresbackpressure - 28
Топик Kafka из 24 партиций обрабатывает 100 000 событий в секунду, предел одной партиции равен 5 000, а один tenant создаёт 30 000. Как изменить ключ партиционирования?
partitioningkafka - 29
Старые consumers могут работать 14 дней, пока producer добавляет currency и переименовывает amountCents в amountMinor. Как развить событие через JSON Schema, Avro или Protobuf?
schema - 30
Система BullMQ получает 200 задач в секунду со средней длительностью 1,5 секунды и запускает billing каждые пять минут. Как настроить durability Redis, retention, job IDs и concurrency workers?
retentionredissystem-design - 31
Эндпоинт Node.js стабильно обрабатывает 40 000 RPS, использует 85% одного ядра CPU и имеет p99 90 мс без текущего сбоя; как с помощью --cpu-prof или inspector и flame graph получить доказательства для оптимизации?
optimizationlatencyendpoints - 32
Пользовательский Transform получает chunks по 1 MiB и расширяет каждый до 8 MiB, а downstream writable записывает 20 MiB/s; как должны взаимодействовать _transform, push и callback для ограничения памяти?
memorycallbacks - 33
Сервис Node.js потоково расшифровывает объект размером 20 GiB во временный файл и должен отменить работу за 2 секунды после отключения клиента; как использовать stream.pipeline для отмены, ошибок и очистки?
resilienceci-cd - 34
У objectMode Transform значения readableHighWaterMark и writableHighWaterMark равны 16, а каждый объект удерживает Buffer размером 5 MiB; какой риск для памяти это создаёт на 8 pods?
memory - 35
Один Readable выдаёт 200 MiB/s и должен отправлять одинаковые байты в три destinations со скоростью 200, 150 и 20 MiB/s; какую ограниченную архитектуру вы выберете для передачи длительностью 10 минут?
architecture - 36
Кластер PostgreSQL допускает 300 подключений, API на Node.js работает в 12 pods с rollout surge 25%, а 60 подключений нужно зарезервировать; какой максимум пула на pod вы настроите?
postgresapiconfig - 37
Маршрут получает 600 одновременных запросов, каждый удерживает один PostgreSQL client 40 мс, пул содержит 20 clients, а SLO ответа равен 250 мс; как ограничить ожидание подключения и очередь пула?
concurrencydata-structurespostgres - 38
Checkout использует pg pool на 30 clients, тратит 20 мс на SQL и вызывает платёжный API с p95 800 мс при 100 одновременных запросах; почему транзакция закрепляет один client и стоит ли держать удалённый вызов внутри неё?
sqltransactionsapi - 39
Четыреста Node.js clients подключены через transaction pooling PgBouncer к 40 соединениям PostgreSQL, а приложение выполняет именованный prepared query 50 000 раз в минуту и использует SET search_path и LISTEN; какие поведения безопасны и что нужно изменить?
transactionsqueriespostgres - 40
AWS Lambda имеет reserved concurrency 1 000, каждая execution environment создаёт pg pool с max 5, а RDS допускает 500 подключений при резерве 100; как сравнить прямые подключения и RDS Proxy?
concurrencylambdaproxy - 41
Endpoint запускает 20 вызовов fetch через Promise.all, и вызов 7 отклоняется через 80 мс, пока остальные могут выполняться 2 секунды. Что произойдёт и как остановить уже ненужную работу?
endpointspromises - 42
Вы читаете из 5 реплик, для кворума нужны любые 3 корректных ответа, а отдельно хеджируете чтение через 3 региона ради первого корректного ответа. Где применимы Promise.allSettled и Promise.any?
replicationpromises - 43
Задача Node.js должна обработать 100 000 записей в среднем по 8 КиБ через зависимость с задержкой 200 мс и лимитом 250 запросов в секунду. Как ограничить конкурентность promises и память?
promisesconcurrencydependencies - 44
При 10 000 запросов в секунду HTTP-запрос публикует сообщение Kafka и планирует ретрай через таймер на 200 мс. Как передавать контекст AsyncLocalStorage и где он может потеряться?
kafkaresiliencehttp - 45
Endpoint на Fastify или NestJS принимает JSON до 2 МиБ и не более 100 позиций. Почему TypeScript недостаточно и как обеспечить runtime-контракт?
endpointstypescript - 46
API на Node.js обслуживает 30 000 запросов в секунду, а наивный код пишет 3 JSON-лога на запрос. Как спроектировать структурированные логи с корреляцией, маскированием чувствительных данных и контролем кардинальности?
correlationapidesign - 47
Сервис обрабатывает 20 000 HTTP-запросов в секунду, публикует в Kafka, обращается к PostgreSQL и создаёт в среднем 8 spans на запрос. Как инструментировать и сэмплировать OpenTelemetry traces?
postgresquerieshttp - 48
Публичный API обслуживает 100 миллионов запросов за 28 дней с SLO доступности 99,9% и целью задержки 300 мс. Какие RED-метрики и buckets гистограммы нужно экспортировать?
distributionsapilatency - 49
Как определить версионированный контракт cursor pagination для изменяемого набора из 50 миллионов строк с 5 000 обновлений в секунду и максимумом 100 строк на страницу?
pagination - 50
Gateway GraphQL Federation обслуживает 15 000 запросов в секунду с целью p99 250 мс; один запрос может получить 500 товаров вместе с полями цены и отзывов, а мобильные клиенты остаются активными 12 месяцев. Как ограничить выполнение и развивать схему?
queriesschemagraphql - 51
У сервиса обработки изображений на Node.js RSS растёт на 180 MiB в час, heapUsed после GC возвращается к 420 MiB, а pod достигают лимита 2 GiB через 7 часов; как провести диагностику и сдержать проблему до завтрашнего пика?
- 52
В 14:00 p99 checkout вырос со 140 мс до 1,8 секунды, а monitorEventLoopDelay показал 240 мс после релиза с синхронным gzip для ответов по 6 MiB; что вы сделаете в первые 30 минут?
monitoring - 53
Платёжная зависимость начинает отвечать 503 на 20% вызовов, три слоя ретраев превращают 4 000 пользовательских запросов в секунду в 22 000 попыток, а инцидент нужно стабилизировать за 15 минут; как вы отреагируете?
incidentsresiliencedependencies - 54
При нагрузке 12 000 RPS p99 API вырос со 190 мс до 920 мс, p50 остался 75 мс, а CPU достиг 88%; как найти и исправить хвостовую регрессию до релиза в пятницу?
load-testingapi - 55
У сервиса pg pool на 30 соединений, p99 получения соединения достигает 2,4 секунды, 180 запросов ждут, а CPU PostgreSQL равен лишь 45%; как восстановить SLO API 300 мс за час?
postgresapislo - 56
После деплоя 6 из 20 pod падают с unhandledRejection при таймауте записи аудита, а Kubernetes перезапускает каждый pod за 20 секунд; как сегодня найти первопричину и исключить потерю запросов?
kubernetesdeployment - 57
Экспорт из Kafka читает 90 MiB/s, S3 пишет 25 MiB/s, игнорирование результата write увеличивает очередь процесса до 6 GiB за 80 секунд, а pod упадёт по OOM через 3 минуты; как ограничить систему?
concurrencydata-structureskafka - 58
Node.js-инженер потратил 90 минут на перезапуск pod во время двух инцидентов, не проверив event-loop и pool metrics, а через 3 недели снова выходит основным on-call; как вы будете его менторить?
mentoringincidentson-call - 59
После включения нового mapper время GC выросло с 4% до 28%, minor collections происходят 40 раз в секунду, а throughput упал на 35%, хотя post-GC heap стабилен; что вы исследуете?
throughputdata-structures - 60
Heap snapshots показывают 70 000 объектов, удерживающих Buffers общим размером 512 MiB после разбора заголовков по 2 KiB из загруженных файлов, а RSS растёт на 90 MiB в час; какова вероятная ошибка и исправление?
snapshotdata-structures - 61
Пул worker_threads получает 40 задач с изображениями в секунду и ArrayBuffers по 32 MiB, RSS скачет на 1,3 GiB, а p99 превышает 2 секунды после перехода с transfer на clone; как вы отреагируете?
refactoring - 62
Pod с 4 vCPU выполняет 80 операций scrypt в секунду, p99 файловой системы вырос с 20 мс до 1,4 секунды, а очередь UV thread pool превышает 900 мс; что изменить до дедлайна batch через 2 часа?
concurrencydata-structuresbatch - 63
Downstream API замедляется до 3 секунд, число активных sockets растёт с 200 до 12 000, ожидающих запросов до 30 000, а pod Node.js падает по OOM за 6 минут; как исправить HTTP client?
httpzero-to-one - 64
После установки server keep-alive в 4 секунды при переиспользовании upstream-соединений балансировщиком в течение 60 секунд ECONNRESET вырос до 3,8%, а p99 удвоился; как исправить инцидент?
incidentsload-balancing - 65
Worker отчётов падает с EMFILE через 25 минут, открытые file descriptors растут со 180 до 9 800, а временных файлов остаётся 4 000; как найти и остановить утечку?
descriptors - 66
Kafka consumer обрабатывает batch 8 минут, группа выполняет rebalance каждые 5 минут, а 14% записей обрабатываются дважды до дедлайна расчётов 30 минут; что вы измените?
kafkabatchconcurrency - 67
Одна некорректная запись Kafka уронила consumer Node.js 46 раз за 12 минут, partition не движется, а возраст сообщения уже 18 минут при SLA 30 минут; что вы сделаете?
partitioningkafka - 68
BullMQ сообщает о 9 000 stalled jobs после CPU throttling workers на 45 секунд, а 320 задач выставления счетов выполнились дважды; как стабилизировать billing до следующего 10-минутного цикла?
throttle - 69
Во время 70-секундного failover Redis workers BullMQ переподключаются без задержки, CPU достигает 100%, а очередь вырастает на 120 000 jobs; каков план восстановления?
recoveryredisdata-structures - 70
Релиз cleanup запускает Redis KEYS tenant:* каждую минуту на 40 миллионах ключей, latency команд достигает 2,6 секунды, а API timeouts 8%; что сделать до следующего запуска?
redisapilatency - 71
После reshard Redis Cluster 6% запросов падают с MOVED в течение 11 минут, потому что custom client кеширует slots на 30 минут; как исправить инцидент?
incidentsrediscaching - 72
Горячий ключ Redis получает 85 000 GET в секунду, один shard достигает 95% CPU, а p99 кеша checkout растёт с 4 мс до 180 мс; как снять нагрузку за 20 минут?
shardingrediscaching - 73
Liveness probe Kubernetes проверяет PostgreSQL, 40-секундное замедление базы перезапускает все 60 pod Node.js, а reconnects истощают базу на 12 минут; что вы немедленно измените?
databasepostgreskubernetes - 74
Rollout отправляет SIGTERM queue worker с 25 активными jobs, Kubernetes убивает его через 30 секунд, а 7 jobs отправляют письма дважды; как исправить lifecycle до второго rollout сегодня?
kubernetesdata-structures - 75
Обновление рантайма Node.js проходит unit tests, но 3% canary pod падают в sharp при обработке изображений, а security deadline равен 48 часам; как действовать?
unitconcurrencyestimation - 76
Сервис CommonJS запускается локально, но 18 production pod входят в CrashLoopBackOff с ERR_REQUIRE_ESM после релиза зависимости, а rollback нужно завершить за 10 минут; что вы сделаете?
dependenciesrollbackmodules - 77
После обновления Node.js CPU вырос на 22%, TLS handshakes падают у одного legacy partner, а дедлайн миграции fleet равен 5 дням; как разделить причины?
estimationmigrationstls - 78
Два конкурентных запроса иногда пишут в лог неправильный tenant после рефакторинга, 0,4% из 50 000 RPS traces приписаны неверно, а audit report нужен завтра; как отладить AsyncLocalStorage?
asyncconcurrencyrefactoring - 79
Включение OpenTelemetry повышает RSS сервиса на 600 MiB, а collector теряет 35% spans при 20 000 RPS, и на защиту pod есть только 1 час; что вы измените?
observability - 80
Изменение логирования пишет 1,2 GiB в минуту в stdout контейнера, event-loop lag достигает 110 мс, а disk pressure узла начинает выселять pod; как исправить это в первый час?
containerslogging - 81
Code review добавляет JSON.stringify для сериализации объекта 120 MiB в HTTP route с SLO 250 мс; какие доказательства и изменение нужны до одобрения?
serializationslohttp - 82
Новое пользовательское regular expression загружает одно ядро Node.js до 100% на 9 секунд для входа 4 KiB, а доступность login падает ниже 99,9%; как вы отреагируете?
regex - 83
Клиенты отменяют 18% поисковых запросов через 400 мс, но downstream fetch продолжаются 12 секунд, а активных promises становится 45 000; как освободить работу?
promises - 84
Scheduler создаёт 80 000 retry timers во время 5-минутного сбоя, heap растёт на 900 MiB, а восстановление вызывает всплеск трафика; какой ограниченный вариант вы внедрите?
resiliencedata-structures - 85
Warnings показывают по 35 listeners на общем EventEmitter, heap растёт на 60 MiB в час, а каждый reconnect дублирует обработку сообщения; как доказать и исправить утечку?
data-structures - 86
p99 DNS lookup растёт до 1,1 секунды только при 64 конкурентных filesystem jobs, а сетевые метрики DNS остаются ниже 20 мс; какую специфичную для Node.js причину вы проверите?
dnsmonitoringconcurrency - 87
Отключение HTTP keep-alive увеличивает TLS handshakes с 900 до 18 000 в секунду, CPU достигает 92%, а p99 API превышает 300 мс; как восстановить сервис?
httptlszero-to-one - 88
Деплой заставляет 30 000 WebSocket-клиентов переподключиться за 20 секунд, file descriptors достигают 95% лимита, а p99 Redis аутентификации равен 700 мс; что вы сделаете?
rediswebsocketsauth - 89
HTTP/2 client оставляет 6 000 streams открытыми после отмен 499, RSS растёт на 75 MiB в час, а GOAWAY не обрабатывается; как исправить lifecycle?
resiliencehttp - 90
Transaction route удерживает 24 из 25 pg clients на 50 секунд, потому что внешний fraud-вызов стоит между BEGIN и COMMIT, а p99 checkout достигает 8 секунд; как это исправить?
transactions - 91
После изменения ORM list route выполняет 501 запрос PostgreSQL для 500 заказов, p99 растёт с 220 мс до 2,7 секунды, а окно релиза закроется через 45 минут; что вы сделаете?
ormpostgresqueries - 92
Смена плана PostgreSQL повышает p99 одного запроса с 40 мс до 1,9 секунды при 9 000 RPS, а pool wait Node.js достигает 700 мс; как сдержать и проверить исправление?
queriespostgres - 93
Kafka brokers недоступны 4 минуты, producer Node.js буферизует 1,8 миллиона записей, а RSS достигает 1,6 GiB при лимите pod 2 GiB; как предотвратить OOM и потерю данных?
kafka - 94
В Kafka topic 48 partitions и 48 consumers, но одна partition достигает lag 2,4 миллиона записей и SLA 20 минут, пока остальные актуальны; что вы проверите и измените?
partitioningkafka - 95
В начале часа одновременно истекают 300 000 записей Redis, CPU PostgreSQL достигает 98%, а p99 API растёт со 120 мс до 4 секунд на 6 минут; как остановить cache stampede?
postgresredisapi - 96
Pod использует 1,85 GiB из лимита 2 GiB, V8 сообщает allocation failure, а support просит heap snapshot за 10 минут; какое решение безопасно?
snapshotdata-structures - 97
Native compression addon вызывает segfault двух pod в час только на ARM nodes, JavaScript logs резко обрываются, а дедлайн миграции через 3 дня; как найти первопричину?
estimationmigrationsjavascript - 98
Один worker thread падает каждые 7 минут на некорректном input, parent немедленно заменяет его, очередь растёт до 50 000 jobs, а CPU остаётся 100%; как остановить restart loop?
concurrencydata-structures - 99
Production errors показывают только minified frames из dist после TypeScript build, за 20 минут произошло 700 сбоев, а команде нужна строка исходника за 30 минут; что вы сделаете?
typescript - 100
Изменение метрик добавляет labels userId и raw URL, число series Prometheus растёт с 400 000 до 18 миллионов за 25 минут, а scrapes не успевают до следующей передачи on-call; как восстановить observability?
observabilitymonitoringon-call