Blog
November 25, 2023

Использование Elixir Phoenix в коммерческом проекте SaaS

Linkly написан на Elixir.

Я всегда хотел получить опыт работы с экосистемой Erlang, а Elixir — это легкий путь к этому.

Я не буду здесь рассказывать о преимуществах BEAM или Erlang напрямую, так как об этом писали в других местах. Вместо этого я сосредоточусь на практических аспектах использования Elixir Phoenix для реального проекта.

Я предполагаю, что вы знаете, что такое Ruby on Rails, так как Phoenix, веб-фреймворк Elixir, сильно вдохновлен Rails.

Собственно программирование на Elixir Phoenix

Программирование на Elixir — это радостный опыт.

Он следует парадигмам, похожим на Rails, включая MVC, и даже выглядит похожим.

В отличие от Rails, код компилируется перед запуском. Это полезный шаг, так как позволяет вам перехватить ошибки, которые в противном случае вы бы могли пропустить.

Модели в Phoenix сгруппированы в «Контексты». Это дополнительный уровень абстракции, предназначенный для создания четкого разделения между частями приложений, например Пользователи и Продукты. Каждый контекст может содержать любое количество моделей.

Производительность

Много говорилось о производительности в других блогах, поэтому я рассмотрю практическую сторону здесь.

Для полнофункционального веб-фреймворка производительность явно намного выше, чем у Rails, и требует значительно меньше оборудования для запуска.

Время «загрузки» при выполнении mix phx.server в сравнении с rails server быстрее. Даже при разработке на ноутбуке страницы загружаются заметно быстрее с Phoenix.

Доступность пакетов для Elixir Phoenix и Rails

На первый взгляд, здесь есть разница. Rails имеет много тысяч gems по сравнению с репозиторием Hex для Elixir.

На самом деле, почти все, что вам действительно нужно, доступно в системе пакетов Elixir Hex — парсеры JSON, HTTP-клиенты, инструменты для форматирования и парсинга Markdown — все это есть, и качество модулей исключительное.

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

Платформы, такие как Stripe и Recurly, поддерживают свои собственные Rails gems для взаимодействия с их API. Это может быть удобно, но поддержка для Elixir обычно отсутствует.

Однако я обнаружил, что было очень легко использовать пакет Tesla для взаимодействия с HTTP-эндпоинтами сервисов, и в конечном итоге я предпочел работать таким образом, а не использовать предварительно упакованные gems, так как это легче и позволяет вам понять, что происходит.

Абстракция базы данных — Ecto и ActiveRecord

Ecto не так полнофункционален, как ActiveRecord.

Это не его целью быть.

Ecto — это простая оболочка базы данных, которая отображает запросы к базе данных на объекты Elixir.

Вначале я считал раздражающим, что он не работает так же, как ActiveRecord.

Однако Ecto позволяет вам взаимодействовать с базой данных очень простым способом и на самом деле делает программирование веб-приложений намного проще.

С ActiveRecord, как только вы начнете создавать сложные запросы, потребуется больше времени, чтобы разобраться с ActiveRecord, чем просто написать запрос на SQL.

Использовав оба, я пришел к выводу, что использование легкой оболочки базы данных, такой как Ecto, проще, чем использование тяжелой абстракции, такой как ActiveRecord.

Это дает вам безопасность использования оболочки базы данных, без головной боли и груза «слишком умной» абстракции.

Оба содержат функциональность миграции и отката.

База данных по умолчанию для проектов Phoenix — это Postgres.

Для тех, кто использует NoSQL базы данных, Ecto работает с Mongo.

Более того, Ecto работает с функциями NoSQL Postgres, позволяя вам сохранять и запрашивать JSON без необходимости в Mongo.

Аутентификация пользователя

Это область, в которой Elixir Phoenix не хватает.

Rails имеет модуль Devise. Phoenix имеет Coherence, однако в настоящее время это не поддерживается.

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

Это утомительно и несет существенный риск безопасности.

Я выбрал использование Auth0, которое хорошо работало с Phoenix. Возможно, это в любом случае было бы лучшим решением, но было бы хорошо иметь выбор.

Развертывание и хостинг

Основным хостом приложений Phoenix является Gigalixir, небольшая американская компания, управляемая энтузиастами Elixir.

Gigalixir размещен в Google Cloud, поэтому базовая инфраструктура надежна.

Buildpack Gigalixir упрощает развертывание и поддерживает все умные стратегии развертывания Elixir (distillery, mix).

Это дороже, чем «сделай сам», но большая часть стоимости связана с хостингом базы данных Postgres.

Elixir Phoenix настолько легкий, что может работать на небольших docker-подах и все еще обрабатывать очень большое количество запросов.

Несмотря на наценку, это абсолютно стоит того, чтобы избежать головной боли.

Я просто добавлю, что их служба поддержки клиентов выдающаяся.

Доступность программистов

Программистов на Elixir намного меньше.

Elixir — это «язык программистов» — язык, к которому люди приходят, изучив что-то другое.

Несмотря на это, те, кто программирует на Elixir, обычно лучше программисты. Возможно, это результат осознанного выбора более хорошего языка.

Это напоминает мне ранние дни Rails, когда казалось, что только «звезды» будут его использовать (в сравнении с PHP).

Любой хороший программист на Rails без проблем освоит Elixir Phoenix и начнет работать в течение нескольких дней.

Буду ли я снова использовать Elixir Phoenix?

Определенно.

Я работал со многими языками, и Elixir — это самый легкий и мощный язык, с которым я работал.

Я с нетерпением жду написания кода на Elixir.

Получите 100 коротких ссылок и отслеживайте 500 кликов в месяц бесплатно.