Вы тоже хоть раз ловили себя на мысли: «А может, ну его, этот Node.js — перепишем всё на Rust, и будет летать?»
Поздравляю — вы не одиноки. Я тоже через это прошёл.
В этой статье я разложу по полочкам, когда действительно стоит лезть в Rust, а когда лучше остаться на TypeScript и просто выспаться. Без фанатизма, маркетинга и с примерами из практики.
Зачем вообще думать о переписывании
Переписывать код ради хайпа — худшее, что можно сделать с живым продуктом. Но иногда ситуация доходит до того, что без хирургии никак:
Латентность скачет как курс крипты. p99 вылезает за все рамки, а пользователи жалуются на тормоза.
CPU кипит, как чайник. Оптимизировали всё, что можно, а сервис всё равно жрёт ресурсы.
GC устраивает вечеринку на проде. Временами всё просто замирает.
Безопасность. Сервисы, работающие с низкоуровневыми данными (шифрование, парсинг, форматы).
Если ничего из этого нет — расслабьтесь. TypeScript вам подходит идеально.
Что хорошего в TypeScript
TypeScript — это комфорт, гибкость и скорость.
Куча библиотек, отличная экосистема, быстрая разработка, всё ясно и прозрачно.
Он идеален, когда:
сервис I/O-bound (много запросов, мало вычислений);
важна скорость изменения бизнес-логики;
команда большая и разноуровневая.
Вывод: если узкое место не в CPU — оставайтесь на TS. Там, где важнее бизнес, чем наносекунды, Rust просто не окупится.
Зачем вообще Rust?
Rust — как спорткар: быстрее, надёжнее, безопаснее, но требовательный к водителю.
Что он реально даёт:
Скорость. Никакого GC, минимум абстракций, всё чётко.
Память. Контроль, предсказуемость, никаких утечек.
Параллелизм. Tokio и async дают гибкость без боли.
Безопасность. Borrow checker — не враг, а телохранитель.
Но давайте честно: разработка в Rust медленнее, найм дороже, а ментальное усилие — выше. Это не язык «для всех».
Где выигрыши настоящие, а не иллюзорные
Сценарий | Что даёт Rust | Реальный прирост |
---|---|---|
CPU-bound вычисления | Нет интерпретации JS | x2–x10 |
Работа с памятью / GC | Предсказуемость | -50–70% латентности на p99 |
Безопасность (crypto, parser) | Нет UB / утечек | 💎 priceless |
I/O-bound API | Почти без разницы | ±0% |
Не путайте «производительность» с «ощущением контроля». Иногда просто измерения дают больший прирост, чем Rust.
Как подойти без боли (и увольнений)
Полный «big rewrite» — это билет в ад. Рабочие проекты так не делают.
Вот проверенные пути:
🔹 1. Вынести горячий кусок
Нашли bottleneck — вынесите в отдельный микросервис на Rust.
gRPC, HTTP, хоть сокеты — не важно. Так безопаснее всего.
🔹 2. N-API / napi-rs / Neon
Маленький CPU-модуль можно собрать в native addon.
Node.js остаётся обвязкой, Rust делает тяжёлую работу.
#[napi]
fn sum(a: i32, b: i32) -> i32 {
a + b
}
И вызывать это из TypeScript как обычную функцию. Красота.
🔹 3. WebAssembly
Отличный вариант, если у вас edge-сервисы, Cloudflare Workers, или нужен общий код между backend и frontend.
🔹 4. Полная переписка
Только если код уже нельзя поддерживать, и переписка дешевле латания.
(спойлер: это редкость).
Пример для наглядности
Вот тот самый «учебный» пример с Fibonacci.
TypeScript:
function fib(n: number): number {
return n < 2 ? n : fib(n - 1) + fib(n - 2);
}
Rust:
fn fib(n: u32) -> u64 {
match n {
0 => 0, 1 => 1, n => fib(n - 1) + fib(n - 2)
}
}
На небольших n
— одинаково. На больших — Rust уходит вперёд, как болид на прямой. Но кто в продакшене вообще считает Fibonacci без кеша?..
Как понять, что Rust действительно помог
Без метрик — всё гадание на кофейной гуще.
Проверяйте:
p50 / p95 / p99 latency
CPU load
память
RPS на инстанс
стоимость облака
Смотрите не только на скорость, но и на стабильность хвостов. Rust часто даёт не столько прирост, сколько предсказуемость.
Чеклист: стоит ли вам вообще туда лезть
Отметьте галочками:
☐ У вас CPU-bound сервис
☐ Проблемы с GC или памятью
☐ p99 тормозит и влияет на бизнес
☐ Есть в команде Rust-разработчики (или желание стать ими)
☐ Хотите снизить расходы на инфраструктуру
Если набралось 3+ — сделайте прототип в Rust.
Если нет — закройте вкладку и займитесь профилированием на Node.
И немного философии напоследок
Rust — не серебряная пуля. Это инструмент, который даёт мощь и контроль, но требует зрелости и дисциплины.
TypeScript — это про скорость и бизнес. Rust — про контроль и эффективность.
Главное — не язык. Главное — понимание, где узкое место, и зачем вы его меняете.
Измеряйте, прототипируйте, проверяйте гипотезы.
Тогда ваша команда будет не просто писать код, а принимать инженерные решения.
🦀 Итог: не переписывайте всё — перепишите только то, что действительно тормозит.
Rust — как хороший нож: в умелых руках он режет отлично, в неумелых — просто оставляет шрамы.