Skip to content

Эксперименты с использованием Rust для web-backend

Notifications You must be signed in to change notification settings

Kerminator1973/RocketRust

Repository files navigation

Экспериментирование с использованием Rust для разработки web-приложений

Rust кажется очень перспективным инструментом разработки, в том числе, применимым для разработки web-приложений. Rust позволяет генерировать компактные и быстрые нативные приложения. Забегая чуть вперёд, можно утверждать, что исполняемый файл (exe) для Windows x64-86, с примитивной реализацией web-сервера занимает всего 1,5 Мб и стартует быстрее, чем за секунду.

Rust часто сравнивают с языком программирования Go, но у этих языков разные цели и области применения. "Gophers value simplicity, Rustaceans value safety". Оба языка являются компилируемыми, но в Go используется Garbage Collector. Производительность и надёжность кода у Rust выше. Соответственно, ключевые области применения Rust: mission critical code и приложения, требующие максимальной вычислительной эффективности.

На Rust был переписан репозитарий npm и DNS-сервера от Cloudflare. Отмечается, что Rust-приложения обладают отличной предсказуемостью операций выделения памяти, чем не могут похвастаться приложения на Go, Java, JavaScript и платформы .NET.

Ещё одна важная возможность Rust - использование inline asm, что позволяет создавать супер-эффективные (в контексте расхода вычислительных ресурсов) приложения:

use std::arch::asm;

let mut x: u64 = 4;
unsafe {
    asm!(
        "mov {tmp}, {x}",
        "shl {tmp}, 1",
        "shl {x}, 2",
        "add {x}, {tmp}",
        x = inpot(reg) x,
        tmp = out(reg) _,
    );
}
assert_eq!(x, 4 * 6);

Также следует отметить статью Microsoft seeks Rust developers to rewrite core C# code by Richard Speed, в которой указывается, что Microsoft ищет специалистов для переписывания части инфраструктуры с C# на Rust (январь 2024 года). Требования к соискателям буквально следующие: "guiding technical direction, design and implementation of Rust component libraries, SDKs, and re-implementation of existing global scale C# based services to Rust". Справедливости ради, объявление о вакансии было размещено в Чехии и связано с переработкой облачных сервисов, для которых время поднятия контейнера - критически важная метрика, т.е. в данном случае, конечно же нет разговора об отказе от использования C#, но совершенно чётко указана ниша, в которой Rust значительно превосходит C#.

На конференции Open Source Summit 2023 Japan, Линус Торвальдс, выступая в keynotes, сообщил, что Rust пока ещё не доказал, что это "следующая большая вещь", но в 2024 году в Linux появятся драйвера, написанные на Rust. Торвальдс не пишет код на Rust, но читает его и может принимать решения о включении Rust-кода в Linux.

Приблизительно в том же направлении движется Google, который Google Spends $1 Million to Make Rust, C+ ‘Interoperable’ - это статья от 5 февраля 2024 года.

Беглый анализ Tutorial-ов позволил сделать заключение о том, что одной из наиболее популярных библиотек для разработки backend является Rocket.

Выявленные негативные аспекты

Размер собираемого web-проекта (папка target) может составлять более 2,5Гб, что предполагает вместительный накопитель - как минимум в 512Гб. Особенно серьёзно этот аспект может влиять на сервера сборок с большим количеством проектов.

Для информации, размер папки "target" для web-проектов:

  • с использованием Rocket 0.4 (Debug): 1164Мб
  • с использованием Rocket 0.5 (Debug+Release): 2675Мб

Время загрузки зависимостей может составлять минуты, компиляция - десятки секунд.

Пример исходного кода

В соответствии с conventions для имени проекта с Rust-кодом используется underscore names. Соответственно, стартовый проект был назван rust_web_server. Шаблонный код проекта на Rust был сгенерирован командой:

cargo new rust_web_server --bin

Флаг --bin указывает, что cargo должен сгенерировать binary-based project.

Описание дополнительных команд CLI доступно по ссылке.

После генерации проекта сразу же возникает несколько чудес, которые могут причинить небольшие ментальные травмы, если эти чудеса сразу же не задавить. Во-первых, может потребовааться переключение Rust на nightly-версию, если рекомендуемый пример кода не работает. Часть синтаксических возможностей компилятора доступна только в nightly-версии.

В модели разработки языка Rust есть три канала выпуска (правила выпуска): ночной (Nightly), бета (Beta) и стабильный (Stable). Для большинства разработчиков подходит Stable-канал выпуска. Однако, если нужны некоторые экспериментальные возможности, может потребоваться выбрать Beta, или Nightly-канал. Выбор Beta-канала чаще всего обусловлен необходимостью понимания расхождений кодовой базы и новой версии языка и это канал используется на CI/CD.

Переход на ночной канал выпуска можно выполнить следующим образом:

rustup override set nightly

Проверочная команда:

cargo version

Более подробная информация о необходимости использования Nightly-версии компилятора с Rocket доступна здесь.

Вторая проблема - добиться когерентности между примером кода и устанавливаемой версией Rocket. При автоматическом добавлении зависимости командой cargo add rocket была установлена версия Rocket 0.4.11. Чтобы увидеть версию, следует открыть файл "Cargo.toml", в котором есть раздел зависимостей:

[dependencies]
rocket = "0.4.11"

Стартовый пример приложения рекомендуется брать из раздела сайта Rocket, посвящённого конкретной версии продукта. Например, для Rocket 0.4 пример нужно брать именно из раздела версии 0.4.

Пример с которого ознакомление с Rocket начал я был таким (Rocket 0.4):

#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use] extern crate rocket;

#[get("/hello/<name>/<age>")]
fn hello(name: String, age: u8) -> String {
    format!("Hello, {} year old named {}!", age, name)
}

fn main() {
    rocket::ignite().mount("/", routes![hello]).launch();
}

Сборка и запуск приложения осуществляются в Command Prompt (не PowerShell) следующими командами:

cd .\rust_web_server\
cargo build --release
cargo run

После запуска приложения к нему можно подключиться по URL: http://localhost:8000/hello/max/49

Сравнение версий Rocket приведено по ссылке 0.4.11 vs 0.5.0-rc2.

Ссылки по теме

Следует заметить, что Rocket имеет build-in поддержку баз данных, таких как Postgres, MySQL, SQLite, Redis, Memcache. См. официальную документацию. В качестве облачной базы данных предлагается использовать SurrealDB

Rust подходит для разработки ПО для микроконтроллеров. Об этом, в частности, написана статья Rust on an STM32 microcontroller by Marco Amann.

Популярные crates

  • Tokio - управляемая по сообщениям (event-driven), не блокирующая платформа ввода/вывода (non-blocking I/O platform) для разработки асинхронных приложений ввода/вывода (back-end). Высокая популярность Tokio связана именно с асинхронностью. В базовых библиотеках Rust есть свой собственный web-сервер, но он не является асинхронным и очень сильно проигрывает в производительности, при сравнении с Tokio
  • Serde - framework для сериализации/десериализации данных, например, JSON. Рекомендуется для ознакомления статья Кратко про Serde в Rust by artem badcasedaily1.

Альтернативные варианты разработки Desktop-приложений

Один из продвигаемых на Medium фреймворков называется Yew. Рекомендуется к прочтению статья Exploring Yew, the rust-based frontend framework as a React Developer by Demola Malomo.

Slint - ещё один Framework для разработки Desktop-приложений на Rust.

Использование Rust для разработки прошивок микроконтроллеров

Ключевая статья: Rust on an STM32 microcontroller by Marco Amann.

Установка кросс-компиляторов для Rust осуществляется таким образом:

rustup update
rustup component add llvm-tools-preview
rustup target add thumbv7em-none-eabihf
cargo install cargo-binutils cargo-embed cargo-flash cargo-expand

Также можно почитать о пректе Slint - это Framework для разработки GUI-приложений для Embedded-устройств. Бывшие разработчики Qt из Trolltech сделали новый Framework, который работает даже на микроконтроллерах с 256 Кб ОЗУ.

Code covegare in Rust

Рекомендуется для ознакомления автор - Dotan Nahum. Начать исследование темы покрытия кода тестами можно со статьи How to do code coverage in Rust.

About

Эксперименты с использованием Rust для web-backend

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages