Фактически, Rust не подходит для разработки веб-API.

Rust - потрясающий язык программирования с очень хорошими инструментами CLI, такими как ripgrep и exa. Такие компании, как Cloudflare, используют и поощряют людей писать Rust для запуска микросервисов. Программное обеспечение, написанное на Rust, может быть безопаснее, меньше и чище, чем C ++ или C.

Если я пишу геокодер, механизм маршрутизации, платформу обмена сообщениями в реальном времени, базу данных или инструмент командной строки, Rust мне больше всего подходит.

Но в прошлом году я попытался использовать Rust для написания чистого API-сервиса для традиционного веб-сайта, и Rust мне не подошел.

1 Отсутствует много мелких функций

Rust имеет большое количество фреймворков веб-сервисов, коннекторов баз данных и парсеров. Но есть только очень низкоуровневые компоненты для создания службы аутентификации. У Node.js есть паспорт.js, у Rails есть дизайн, а у Django есть готовая модель аутентификации. В Rust вам нужно научиться конвертировать совместно используемый Vec в базовую библиотеку шифрования для построения этой системы (Примечание переводчика , Vec - это динамический массив, который будет только автоматически увеличиваться, но не сжиматься. В отличие от Array, Vec имеет возможность динамически добавлять и удалять элементы, и к нему можно получить произвольный доступ с эффективностью O (1). Все элементы содержимого в Vec генерируются в кучи, Vec можно легко переместить из стека, не беспокоясь о том, что копирование памяти влияет на эффективность выполнения, в конце концов, просто скопируйте указатель в стек). Некоторые библиотеки пытаются решить эту проблему, например libreauth, но они только начали разработку. Есть много похожих проблем с веб-фреймворком.

Что насчет SDK? На основных языках программирования вы можете получить доступ к облачным сервисам Google, AWS или Stripe через официальную библиотеку. Большинство из этих официальных библиотек великолепны. Например, библиотеки aws-sdk-js и Stripe очень хорошо разработаны и поддерживаются.

Rust не такой. Существует всего несколько сторонних библиотек, но, учитывая скорость разработки этих сервисов, могут ли они действительно обеспечить высокое качество?

Кто-то скажет: "Хорошо, язык программирования X настолько хорош, что вы можете написать SDK самостоятельно на выходных!" Я должен ответить, нет.

Экосистема Rust очень богата и в других областях. Ящики, используемые для создания интерфейса командной строки, управления параллелизмом, использования двоичных данных и базового анализатора, впечатляют и великолепны.

2 Компилятор Rust быстрее, чем раньше, но все равно очень медленный

Я смотрел блог Николаса Нетеркота, в котором он описывал, как команда Rust оптимизировала компилятор, чтобы сделать его быстрее!

Но по сравнению с другими языками программирования создание веб-сайтов с его помощью будет очень медленным. Он намного медленнее, чем скомпилированный язык программирования Go, а также намного медленнее, чем интерпретируемые языки программирования JavaScript, Ruby и Python.

Как только код скомпилирован, все становится отлично! Но в моем случае даже базовые функции API были неполными, это несложная система - на компиляцию ушло более 10 минут. Конфигурация оборудования, созданная кодом Google, очень плохая, каждый раз время ожидания истекает, и я не могу ничего скомпилировать.

Пока зависимости кэша не перестраиваются, кеш имеет смысл. Возможно, уменьшение зависимостей ускорит компиляцию проекта Rust. Но, как и serde, JSON и другие программы сериализации / десериализации, используемые почти всеми, занимают много времени на компиляцию. Должны ли мы заменить serde чем-то, что компилируется быстрее, но не имеет обширной документации и поддержки экосистемы? Это очень плохой компромисс.

3Ржавчина - это сложно

Rust позволяет мыслить в плоскости кода, что очень важно для системного программирования. Это заставляет вас думать о том, как совместно использовать или копировать память, думать о реальных, но маловероятных событиях с малой вероятностью и следить за тем, чтобы обрабатывать их правильно, а также помогает вам писать различные эффективные коды.

Эти опасения разумны, но для большинства веб-приложений они не являются наиболее важными проблемами. Мышление с популярной инерцией может привести к неверным предположениям.

Возьмем, к примеру, безопасность Rust. Это важная часть его лозунга, который абсолютно верен: обещание безопасности Rust и нижний уровень - это и то, и другое - он может работать без сборщика мусора, предотвращая уязвимости, связанные с памятью. Когда вы читаете о «безопасности», вспомните конкурента Rust C. Код на языке C может относиться к любой памяти, которая подвержена переполнению и ошибкам. Код Rust может быть таким же быстрым, как код C, но может защищать доступ к памяти без необходимости использования сборщика мусора или какой-либо проверки во время выполнения.

Но правила памяти Rust не более безопасны, чем Node.js или Python, а веб-приложения, написанные на Rust, не будут безопаснее, чем приложения Python или Ruby в системе. Языки программирования высокого уровня со сборщиками мусора обычно оплачивают потерю производительности, чтобы избежать таких эксплойтов и ошибок. Вы не можете ссылаться на неинициализированную память в JavaScript, потому что в JavaScript нет ссылки между памятью.

Боковое примечание: здесь описываются цели разработки Node.js и других систем - иногда в них действительно есть ошибки. Стоит прочитать объекты кеша Node.js.

Если вы спросите некоторых людей, они скажут, что если вы используете небезопасный код, Rust небезопасен по сравнению с языками программирования с рекуперацией памяти, включая самый популярный веб-фреймворк Actix (Примечание переводчика: Actix - это фреймворк асинхронного параллелизма Rust Actor, на основе Tokio и Future, имеет из коробки асинхронный неблокирующий параллелизм, управляемый событиями. Он реализует низкоуровневую модель акторов, чтобы обеспечить модель параллелизма без блокировок, и в то же время предоставляет синхронный актор, который работает быстро. , надежный и легко масштабируемый https: // actix.rs/), потому что небезопасный код допускает задержку необработанных указателей.

Если вы пишете видеоигру, не стоит останавливать сборку мусора. Если вы пишете код микроконтроллера, любые «накладные расходы» или потери памяти очень плохи. Но большинство веб-приложений могут сэкономить небольшие накладные расходы памяти в обмен на производственную производительность.

Другие атрибуты Rust вызывают почти такие же споры. Его параллелизм потрясающий. Если вы делаете что-то сложное и вам нужно быстро реагировать, это, безусловно, здорово. Но что, если это не так? По меньшей мере, асинхронная экосистема Rust сталкивается с серьезными проблемами: существуют разные асинхронные реализации в разных несвязанных областях, таких как tokio.

Для сравнения: Python Tornado и Twisted реализованы асинхронно, а Node.js - асинхронно, но синтаксис очень уродливый.

Я уверен, что асинхронность Rust будет стабильной и унифицированной, и в будущем с ней будет проще работать, но я буду использовать ее сейчас.

4 Экосистема Rust не ориентирована на Интернет

Многие люди изучают Rust, используя Rust для написания приложений CLI или низкоуровневого кода, и прекрасно проводят время. Значительно меньше людей используют Rust для написания обычных веб-приложений.

Это важная часть выбора технологии: использует ли кто-нибудь инструмент? Они примерно в одном поле? К сожалению, многие из невероятно захватывающих работ в экосистеме Rust не имеют ничего общего с серверами веб-приложений. Действительно, есть несколько многообещающих веб-фреймворков - даже фреймворков более высокого уровня, но нет сомнений в том, что их рынок невелик. Даже основной веб-фреймворк Actix имеет всего несколько основных участников.

Если Rust будет расти текущими темпами, веб-часть сообщества достигнет критического значения, но я не думаю, что достаточное количество людей используют Rust в качестве практического инструмента для веб-сайтов. По сравнению с другими сообществами, многие компании стремятся использовать существующие инструменты для создания веб-приложений. Эти инструменты не являются самыми передовыми, но их достаточно, чтобы отличить зрелые технологии от новых.

5Juniper N + 1 запросов

Это не только Rust, но и экосистема GraphQL, и участие Rust в этой экосистеме является примером.

Проблема N + 1 - это то, что должен знать каждый, кто создает веб-приложение. Главное: у вас есть страница с фотографиями (один запрос), и вы хотите отобразить автора каждой фотографии. Сколько будет запросов: 1. Объедините фотографию и автора или запросите каждую фотографию, чтобы получить автора после получения фото? Или дважды запросите user.id в идентификаторах второй раз, получите всех авторов один раз, а затем сбросьте их атрибуты фотографий.

Запросы N + 1 обычно решаются с использованием в первую очередь базы данных: например, изменение запроса N + 1 на один запрос приведет к очевидной оптимизации производительности. У нас есть много способов попытаться решить эти проблемы: вы можете написать SQL и попытаться использовать CTE и JOIN для выполнения большого объема работы в одном запросе, как мы делаем в Observable, или использовать уровень ORM, такой как ActiveRecord to A quick способ конвертировать N + 1 запросов в предсказуемые запросы.

Juniper - это сервис GraphQL для приложений Rust. GraphQL в основном определяет запрос клиентского приложения, а не серверной части. Дайте ему набор вещей, которые можно запросить, а затем приложение (React или другое) отправит любой запрос в бэкэнд.

Это усложняет серверную часть. Любая оптимизация на уровне SQL невозможна - ваш сервер пишет динамический SQL, оптимизация может полагаться только на службы GraphQL, но не всегда будет эффективной. Например: Juniper по умолчанию выполняет N + 1 запросов, а загрузчик данных решения является относительно грубым и требует отдельного обслуживания. Следовательно, в конечном итоге у вас будет очень быстрый прикладной уровень, но все его время будет тратиться на чрезвычайно неэффективные запросы к базе данных.

Короче говоря, GraphQL очень хорошо работает с базами данных NoSQL и может быстро предоставлять услуги для этих типов запросов. Я уверен, что у Facebook есть определенные базы данных, и GraphQL работает очень хорошо, но другие компании в отрасли сильно полагаются на Postgres и аналогичные продукты.

6 заметок

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

Примечание 1. Как правило, вы можете создать веб-сайт на любом языке программирования. Помните OkCupid на основе C ++? (Примечание переводчика, OkCupid - крупный сайт онлайн-знакомств в Соединенных Штатах). Существует также очень популярное астрологическое приложение Co-star, написанное на Haskell. Если вы хорошо владеете другими языками программирования или можете нанять инженеров, которые хорошо владеют этими языками программирования, вы также можете добиться успеха.

Примечание 2: Я пытаюсь создать API веб-приложения, которое повторно выполняет CRUD (добавление, удаление, изменение и проверка). Его можно рассматривать не как веб-службу, в основном выполняющую одну и ту же операцию быстро и бесчисленное количество раз, а как веб-приложение, которое выполняет множество различных операций и содержит значительный объем бизнес-логики. Если вы разрабатываете что-то отличное от того, что делаю я, то мой совет может вам не подойти. Если вам нужно быстро выполнить одну или две операции, например, вы пишете платежный шлюз или приложение для обмена голосовыми сообщениями, тогда Rust может подойти.

Примечание 3: эта статья была написана в январе 2021 года. Если сообщество продолжит развиваться в будущем, Rust будет постоянно улучшаться, и разработка веб-приложений станет лучше и проще.

В общем, мне очень нравится использовать Rust, прекрасный язык программирования с множеством интересных идей. Надеюсь, что скоро Rust станет наиболее подходящим инструментом для создания того, чем я хочу заниматься. Тем не менее, многие вещи, которые я хочу делать сейчас, должны использовать языки программирования с разными характеристиками, чтобы работать лучше.

Оригинальная ссылка на английском языке: https://macwright.com/2021/01/15/rust.html

1. Альтернативы отечественного производства нематериальны? Вернитесь на интерактивный урок инноваций Zhaoyi!

2. Может ли RISC-V с открытым исходным кодом стать противоядием от «нехватки ядра» в Китае?

3. Raspberry Pi Pico: MCU всего за 4 доллара

4. Есть много причин, по которым MCU поддерживает функцию AI ~

5. В 2020 году я изучил 20 принципов разработки программного обеспечения ~

6. Применение идей конечного автомата во встроенной разработке ~

Отказ от ответственности: эта статья воспроизводится в Интернете, и авторские права принадлежат первоначальному автору. Если вы вовлечены в вопросы авторского права, свяжитесь с нами, мы подтвердим авторские права на основе предоставленных вами материалов сертификации авторских прав и выплатим авторское вознаграждение или удалим контент.

рекомендация

отblog.csdn.net/DP29syM41zyGndVF/article/details/113577279
рекомендация