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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python13 555
  • Облачные технологии9 649
  • QA вакансии2 810
  • Android1 650
  • Инженер данных1 068
  • Продакт-менеджер414

Разработка

  • Backend вакансии1 534
  • iOS1 533
  • AI вакансии749
  • Fullstack вакансии623
  • Frontend вакансии536
  • Mobile вакансии28

По стеку

  • Go7 558
  • Java4 778
  • Node.js1 528
  • Kotlin1 348
  • Rust1 252
  • .NET1 154
  • PHP506
  • C++327
  • C#314

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

  • Kubernetes5 503
  • Linux-инфраструктура4 223
  • DevOps вакансии4 089
  • Terraform / IaC3 059
  • Мониторинг и Observability1 414
  • CI/CD1 240
  • SRE411
  • Кибербезопасность61

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

  • Аналитик данных612
  • Бизнес-аналитик572
  • Data Scientist528
  • Системный аналитик69

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

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

По регионам

  • Вакансии в США30 650
  • Вакансии в Европе12 551
  • Работа в России3 510
  • Вакансии в Канаде2 658

По формату

  • Удалённые вакансии48 186
  • Релокация в США30 650
  • Гибридная работа7 410
  • Офисная работа5 407

По уровню

  • Senior вакансии26 826
  • Middle вакансии12 754
  • Junior вакансии4 519

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

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Darktrace17 вакансий
  • Monzo17 вакансий

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

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

Какие production-риски есть у Fastify: blocking code, connection pooling, config, auth, observability, deploy или graceful shutdown?

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

Production-риски Fastify: синхронный блокирующий код в async handler, отсутствие connection pool настройки в плагинах БД, небезопасные defaults в JWT, пропущенные lifecycle hooks для observability и некорректный graceful shutdown без дренажа соединений.

1. Blocking code

Синхронные операции в async handler блокируют event loop Node.js целиком:

// ПЛОХО
app.get('/compute', async (req, reply) => {
  const result = heavyCryptoSync(req.body.data); // блокирует ~200ms
  return result;
});

// ХОРОШО — offload в worker thread
import { Worker } from 'worker_threads';
app.get('/compute', async (req, reply) => {
  const result = await runInWorker('./heavy.js', req.body.data);
  return result;
});

Инструмент диагностики: --prof флаг Node.js + node --prof-process, либо clinic.js doctor.

Обзор production-рисков Fastify

Fastify — неблокирующий фреймворк, но он не защищает от ошибок, которые разработчик вносит сам. Рассмотрим каждую категорию риска с конкретными примерами и решениями.

2. Connection pooling

Плагин @fastify/postgres использует pg pool. Дефолтный размер — 10 соединений, что мало для нагрузки:

await app.register(fastifyPostgres, {
  connectionString: process.env.DATABASE_URL,
  pool: {
    max: 20,          // под нагрузку
    min: 2,
    idleTimeoutMillis: 30_000,
    connectionTimeoutMillis: 5_000,
  },
});

Аналогично для Redis через @fastify/redis — настраивайте lazyConnect: true и обрабатывайте error события.

3. Config и секреты

Используйте @fastify/env с JSON Schema для валидации переменных окружения при старте:

await app.register(fastifyEnv, {
  schema: Type.Object({
    PORT: Type.Integer({ default: 3000 }),
    JWT_SECRET: Type.String({ minLength: 32 }),
    DATABASE_URL: Type.String({ format: 'uri' }),
  }),
  dotenv: true,
});

Если секрет не задан, приложение падает сразу — это лучше, чем runtime undefined.

4. Auth

@fastify/jwt по умолчанию не проверяет exp, если не передать { complete: true }. Используйте preHandler:

app.addHook('preHandler', async (req, reply) => {
  try {
    await req.jwtVerify(); // бросает если exp истёк
  } catch (err) {
    reply.code(401).send({ error: 'Unauthorized' });
  }
});

Применяйте только к защищённым маршрутам через onRoute hook или отдельный plugin с prefix.

5. Observability

Fastify логирует через Pino. Добавьте reqId в каждый лог и интегрируйте с OpenTelemetry:

import { trace } from '@opentelemetry/api';

app.addHook('onRequest', async (req) => {
  const span = trace.getActiveSpan();
  span?.setAttribute('http.route', req.routerPath);
});

app.addHook('onResponse', async (req, reply) => {
  req.log.info({
    statusCode: reply.statusCode,
    responseTime: reply.elapsedTime,
  }, 'request completed');
});

6. Graceful Shutdown

const signals = ['SIGTERM', 'SIGINT'];
for (const signal of signals) {
  process.on(signal, async () => {
    app.log.info('Shutting down...');
    await app.close(); // дренирует keep-alive соединения
    process.exit(0);
  });
}

app.close() вызывает хуки onClose плагинов — пул БД закрывается корректно.

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

  • Unhandled promise rejection в Fastify 5 завершает процесс — оберните все async handler в try/catch или используйте глобальный setErrorHandler.
  • reply.send() после reply.hijack() вызывает исключение — частая ошибка при работе с WebSocket.
  • Pino async transport (worker thread) при резком завершении процесса теряет последние строки лога — используйте pino.final в обработчике сигналов.
  • JWT refresh token rotation без Redis blacklist приводит к невозможности инвалидировать токены при компрометации.
  • Метрики Prometheus через fastify-metrics по умолчанию открыты на том же порту — нужен отдельный internal server или IP-whitelist.
  • При горизонтальном масштабировании rate-limit плагина (@fastify/rate-limit) без Redis-стора лимиты считаются на каждый pod отдельно.
  • Database connection pool size × число pod не должно превышать max_connections PostgreSQL — иначе новые соединения получат ошибку.
  • Keep-alive timeout Fastify (72s по умолчанию) должен быть меньше таймаута upstream load balancer — иначе 502 при idle соединениях.

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

  • Что такое Fastify и каковы его основные преимущества перед Express.js?
  • Как работает система плагинов (plugin system) в Fastify? Что такое fastify-plugin и почему он нужен для инкапсуляции scope?
  • Что такое schema-based validation в Fastify и как используется JSON Schema?
  • Что такое lifecycle в Fastify? Перечислите основные hooks по порядку.

Что портит ответ

  • Говорить только о запуске Fastify, но не об эксплуатации
  • Не упоминать observability, обновления, безопасность и rollback
  • Описывать риски абстрактно, без способов их снижать

Что слушает интервьюер

  • Видит production-риски Fastify
  • Говорит про monitoring, rollout, rollback и безопасность
  • Умеет ранжировать риски по вероятности и влиянию

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

Проверить себя по теме Fastify →
←Предыдущий вопросЧто такое `@fastify/helmet` и какие заголовки безопасности он устанавливает?Следующий вопрос→Как использовать hooks для request lifecycle observability и auth?

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

Fastifyproduction-readinesstechnical-communicationtechnology-selectiontrade-off-analysis