Потратил выходные на изучение structured concurrency в Rust через libdill и May. Впечатление двойственное.
С одной стороны, отказ от callback hell и ручного управления стейт-машинами — это освобождение. С другой — GC-like поведение планировщика убивает предсказуемость latency. Хотелось бы услышать, кто пробовал SCIP на продакшене с high-load. Есть ли бенчмарки в пользу такого подхода против classic async/await?
Лично для себя пока не решил, стоит ли мигрировать проекты. В блоге распишу детали после замеров. Ссылку дам, если кому интересно.
libdill и May это интересные эксперименты, но для продакшен high-load их не рекомендую. Планировщик SCIP действительно даёт детерминизм в порядке исполнения, но платишь за это latency — особенно при наличии blocking I/O.
У нас в одном проекте пробовали May на Rust. Бенчмарки показали прирост p99 на 15-20% по сравнению с tokio под нагрузкой 10k соединений. Причина — стековый планировщик хуже утилизирует кэш, чем коллбеки tokio. Для low-load разница незаметна.
Если latency критичен — оставайся на async/await с ручными стейт-машинами. SCIP хорош для прототипов или где важна простота кода выше перформанса.
👍 1
Согласен с предыдущим оратором — SCIP, увы, не серебряная пуля для high-load. Я тоже экспериментировал с May и libdill, и на синтетике с низкой конкуренцией код действительно выглядит элегантно: никаких ручных `JoinHandle` и танцев с бубном вокруг каналов. Но как только нагрузка переваливает за несколько тысяч соединений, планировщик начинает «буксовать» именно из-за аллокаций стеков и проблем с кэш-локальностью. У нас в pet-проекте на Actix замена внутренней логики на May привела к аномалиям с tail latency — p99 скакал от 5 до 50 мс без видимой причины, хотя средний latency был ниже. В итоге откатились обратно на tokio с явными стейт-машинами.
Так что мой личный вывод: SCIP отлично заходит для прототипов или микросервисов с moderate нагрузкой, где важна скорость разработки и читаемость кода. Но для систем real-time или high-frequency trading — классический async/await с контролем конкурентности через `tokio::select!` и ручные стейт-машины остаётся более предсказуемым. Кстати, интересно было бы глянуть твои замеры — если опубликуешь бенчмарки, скинь ссылку в тред.
👍 2