Использование Rust с Elixir для повторного использования кода и повышения производительности

Использованиеrustсelixirдляповторногоиспользованиякодаиповышенияпроизводительности

Doctave.com в основном построен на языке Elixir . В частности, Phoenix Web framework . Однако некоторые ключевые части нашего стека построены на Rust , и в этом посте мы рассмотрим причины, почему и как это работает на практике.

Эликсир и Феникс

Стек Эликсир / Феникс оказался надежным и продуктивным. Основа Erlang / OTP , на которой построен язык, очень прочная. У него небольшой объем памяти и более чем достаточно для большинства веб-приложений.

Более того, Phoenix Live View сделал создание интерактивных страниц проще, чем когда-либо. Это часто устраняет необходимость в сложной интерфейсной структуре, такой как React или Vue, и связанном с ней API.

Это обычная тенденция использования Elixir. В других языках или фреймворках вы можете обратиться к внешней службе или программе для обработки кеширования, фоновых заданий или pub-sub. Вместо этого Elixir часто оказывается достаточным и упрощает нашу кодовую базу. Эта таблица из книги Sasa Juric Эликсир в действии резюмирует наш опыт:

table of technologies that Erlang replaces

Почему Rust?

Мы добавили Rust в стек по двум причинам:

и Rustler гарантирует, что NIF будет доступен для нас во время выполнения.

Причина № 2: Производительность

Говорить о производительности и скорости программного обеспечения всегда (или, по крайней мере, должно быть) обсуждение нюансов. На вопрос действительно имеет только один (не -) ответ:

«это зависит от ”.

Так от чего это зависит?

Бюджет HTTP-запроса составляет около

151 - 245 миллисекунды , если вы хотите, чтобы ваше приложение работало быстро. Doctave.com - молодое приложение, и уложиться в этот бюджет было несложно (особенно учитывая, что Phoenix может обрабатывать ответы с точностью до миллисекунды). Но со временем ваше приложение будет выполнять

больше вещей . Без должного внимания время ответа неизбежно будет расти. Если вы потратите свой бюджет слишком рано, вы можете столкнуться с трудностями при его соблюдении в будущем.

Это не значит, что вы не должны расходовать свой бюджет - вы просто необходимо быть

внимательным этого.

Итак, вопрос:

Учитывая этот бюджет, сколько мы сэкономили, анализируя Markdown в Rust вместо Elixir?

Всегда мера

Давайте ответим на это ненаучным экспериментом по сравнению Rust и Elixir Реализации Markdown. Мы будем использовать Файл Markdown , в котором показаны все функции, поддерживаемые Doctave, и показано, как работают две библиотеки.

Чтобы увидеть, как масштабируется производительность с размером ввода мы также запустим синтаксический анализатор с тем же вводом, объединенным вместе 4, 23 , 39, а также 68 раз. Это дает нам размеры от ~ 2,5 килобайт до ~ 226 килобайт. Это вполне разумный диапазон реальных входных данных, даже если они, безусловно, возможны.

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