Любой сервер на Tokio всегда сталкивается с вопросом: как исполнять входящие запросы — создавать tokio::task на каждый запрос, иметь пул tokio::task-акторов или смотреть в сторону FuturesUnordered. От этого решения зависят пропускная способность и расход памяти под нагрузкой. При этом выбор модели часто основывается на опыте предыдущих проектов или интуиции.
Сравним три вышеперечисленные модели на примере нашего user-space NFSv3-сервера на Rust и Tokio — nfs-mamont, который за время разработки успел пожить в каждой из них. Разберем, где каждая модель выигрывает и как ограничивать конкурентность так, чтобы получать backpressure, а не очередь в памяти.
Доклад будет полезен для тех, кто пишет сетевые сервисы на Tokio. Знание NFS не нужно.