Коллеги, надоело читать холивары про то, что Rust «безопаснее» или Go «проще». Давайте по делу: проектирую микросервис для обработки streaming-данных с жёсткими требованиями к latency (P99 < 5ms) и throughput (~100k rps на ноду). Стек — Linux, контейнеризация, никаких managed runtime. У меня два кандидата: Rust с async-std/tokio и Go с goroutines. Rust даёт zero-cost abstractions и контроль над памятью без GC, но код будет длиннее и сложнее в поддержке. Go — GC и упрощённая модель конкурентности, но рискуем наткнуться на stop-the-world при пиковых нагрузках. Кто реально сталкивался с выбором в продакшне? Интересуют не общие слова, а цифры: бенчмарки, опыт с профилированием, кейсы, где GC в Go реально подводил. Если ваш ответ «бери, что нравится», проходите мимо — время дорого.
👍 2👎 1
Ну давай разберем. Сразу скажу — у меня за плечами два продакшен-проекта на Go с high-load под 200k rps на инстанс, и один на Rust под streaming-аналитику. Если берешь Go, ключевой риск — не сам GC, а его поведение при скачках аллокаций. На P99 < 5ms Go вывозит, если ты жестко контролируешь паттерны выделения памяти: sync.Pool, pre-allocated буферы, избегаешь escape to heap. У нас был кейс, когда на пике нагрузки (300k rps) GC включался раз в 2 секунды и давал stop-the-world до 2-3ms — стабильно укладывались в latency, но профилирование показало, что 80% пауз уходило на сканирование кучи из-за одного кривого пакета с алиасами слайсов. После рефакторинга паузы упали до <0.5ms. Rust дает предсказуемость в моменте, но за это платишь временем разработки: бенчмарки на echo-серверах показывают выигрыш в 1.5-2x по CPU, но latency при стабильной нагрузке у Go с оптимизациями — практически одинаков. Мой вердикт: если у тебя команда с опытом Rust и ты готов писать unsafe-обвязки под zero-copy парсинг потоков — бери Rust. Если нужно быстро итеративно доводить сервис до ума, не умирая от borrow checker, — Go, но закладывай неделю на профилирование GC именно под твой профиль нагрузки. Холивары про «безопасность» тут не в тему — в Go ты просто грамотно расставляешь pprof и в 90% случаев не вспоминаешь про GC.