Найти в Дзене
Ржавый код

Bun vs Rust - Сравнение производительности для проверки JWT и запроса MySQL

Оглавление

Введение

После публикации рекордного количества статей о сравнении производительности различных технологий, таких как Node.js, Deno, Bun, Rust, Go, Spring, Python и т.д. для простого hello world case, я последовательно получал комментарии, что статьи были хороши, но не были применимы непосредственно для реальных случаев использования. Меня попросили сделать то же самое для более «реальных» дел. Статьи также (и до сих пор) привлекли рекордное количество просмотров. Тем не менее, точка зрения была принята хорошо. Привет мир был лучшей отправной точкой, но точно это не «реальный» случай.

Реальный сценарий использования

С этой статьи я начинаю новую серию, где я собираюсь сравнить ряд технологий для реального случая:

  • Получение JWT из заголовка авторизации
  • Проверить JWT и получить электронную почту по требованию
  • Выполнение запроса MySQL с помощью электронной почты
  • Возврат записи пользователя

Это очень распространенный реальный случай. Для дела «Hello world» я видел технологии, предлагающие где-то от 70K до 200 тысяч RPS. RPS было высоким, потому что все, что делало приложение, возвращало простую строку. Конечно, мы не будем ожидать 200K RPS для сценария использования JWT + MySQL. Сколько мы получим, пока неясно.

В этой статье сравнивается Bun & Rust для данного случая использования. Это интересное сравнение, потому что Bun интерпретируется, в то время как Rust компилируется в машинный код. Кроме того, проверка JWT является интенсивной операцией ЦП. Скомпилированный язык должен быть быстрее, чем интерпретированный? Не так ли? Это мы узнаем очень скоро.

Испытательная установка

Все тесты выполняются на MacBook Pro M1 с 16G оперативной памяти.

Версии программного обеспечения:

  • Bun v0.6.7
  • Rust 1.69.0

На стороне Bun я использую библиотеку Коа. Koa - это новый веб-фреймворк, разработанный командой, стоящей за Express, который призван быть меньшим, более выразительным и более надежным фундаментом для веб-приложений и API. Другие библиотеки используются для проверки и декодирования JWT и mysql2 для выполнения запросов MySQL.

На стороне Rust я использую веб-фреймворк Actix. Другие пакеты, которые я использую: jsonwebtoken для проверки и декодирования JWT, и sqlx для выполнения запросов MySQL.

Тестер нагрузки HTTP построен на основе libcurl. Существует предварительно созданный список 100 000 JWT. Тестер выбирает случайные JWT и отправляет их в заголовок Authorization запроса HTTP.

База данных MySQL содержит таблицу users, которая содержит 6 столбцов:

-2

Таблица пользователей предварительно заполнена записями 100 КБ:

-3

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

Код

Bun

-4

Rust

-5
-6
-7

Код Rust компилируется в режиме выпуска с помощью опции - release.

Результаты

Каждый тест выполняется для 500K запросов в целом. Уровни параллелизма - 10, 50 и 100 соединений. Перед проведением измерений выдается запрос на разогрев 1K.

Вот диаграммы с результатами:

-8
-9
-10
-11
-12
-13
-14
-15
-16

Анализ

Во-первых, RPS значительно падает от высокого уровня hello world use case. Для простого варианта hello world диапазон RPS составлял от ~ 100 К до 175K. С этим реальным случаем Bun предлагает ~ 11K RPS, в то время как Rust предлагает ~ 15K RPS. Реальность сильно тяжела.

В целом, Rust ведет счет Bun по всем видам измерений. Загрузка процессора Rust довольно высока, в то время как использование памяти минимально. Неужели мы ожидали, что Bun превзойдет Rust? Совсем нет!

Победа: Rust

Статья на list-site.