Usando Elixir Phoenix em um Projeto Comercial SaaS

Linkly é escrito em Elixir.

Eu sempre quis ter exposição ao ecossistema Erlang, e Elixir é uma rota fácil.

Não vou cobrir os benefícios do BEAM ou Erlang diretamente aqui, pois isso já foi escrito em outros lugares. Em vez disso, vou me concentrar nas praticidades de usar Elixir Phoenix para um projeto real.

Vou assumir que você sabe o que é Ruby on Rails, já que Phoenix, o framework web do Elixir, é fortemente inspirado no Rails.

Programando de Fato em Elixir Phoenix

Escrever em Elixir é uma experiência alegre.

Segue paradigmas similares ao Rails, incluindo MVC, e até parece similar.

Ao contrário do Rails, o código é compilado antes de ser executado. Este é um passo útil, pois permite capturar erros que você talvez não teria.

Models no Phoenix são agrupados em 'Contexts' (Contextos). Este é um nível extra de abstração, destinado a criar separação clara entre partes das aplicações, por exemplo, Usuários e Produtos. Cada contexto pode conter qualquer número de models.

Desempenho

Muito tem sido falado sobre desempenho em outros blogs, então vou cobrir o lado prático aqui.

Para um framework web completo, o desempenho é claramente muito mais rápido que o Rails, e requer substancialmente menos hardware para executar.

O tempo 'para inicializar' ao executar mix phx.server vs rails server é mais rápido. Mesmo ao desenvolver em um laptop, as páginas carregam visivelmente mais rápido com Phoenix.

Disponibilidade de Pacotes para Elixir Phoenix vs Rails

Superficialmente, parece haver uma diferença aqui. Rails tem muitos milhares de gems versus o repositório Hex do Elixir.

Acontece que quase tudo que você realmente usaria está disponível no sistema de pacotes Hex do Elixir - analisadores JSON, clientes HTTP, ferramentas para formatação e análise de Markdown - está tudo lá, e a qualidade dos módulos é excelente.

No Rails, há substancialmente mais gems, mas você nunca as incluiria em um projeto real, devido ao seu status não mantido ou ao risco associado com a construção de muitas dependências externas em sua aplicação.

Plataformas como Stripe e Recurly mantêm suas próprias gems Rails para interagir com suas APIs. Isso pode ser útil, mas geralmente falta suporte para Elixir.

Descobri, no entanto, que foi muito fácil usar o pacote Tesla do Elixir para interagir com endpoints HTTP de serviços, e acabei preferindo trabalhar dessa forma, versus usar gems pré-empacotadas, pois é mais leve e permite que você entenda o que está acontecendo.

Abstração de Banco de Dados - Ecto e ActiveRecord

Ecto não é tão completo quanto ActiveRecord.

Não é a intenção que seja.

Ecto é um wrapper de banco de dados simples que mapeia consultas de banco de dados para objetos Elixir.

Inicialmente, achei frustrante que não funcionasse exatamente como ActiveRecord.

No entanto, Ecto permite que você interaja com o banco de dados de uma maneira muito direta, e na verdade torna a programação de aplicações web muito mais fácil.

Com ActiveRecord, uma vez que você começa a construir consultas complexas, leva mais tempo para descobrir o ActiveRecord do que apenas escrever uma consulta como SQL.

Tendo usado ambos, é minha conclusão que usar um wrapper de banco de dados leve como Ecto é mais fácil do que usar uma abstração pesada como ActiveRecord.

Ele te dá a segurança de usar um wrapper de banco de dados, sem a dor de cabeça e o peso de uma abstração "esperta demais".

Ambos contêm funcionalidade de migração e rollback.

O banco de dados padrão para projetos Phoenix é Postgres.

Para aqueles que usam bancos de dados NoSQL, Ecto funciona com Mongo.

Melhor ainda, Ecto funciona com recursos NoSQL do Postgres, permitindo que você salve e consulte JSON sem precisar do Mongo.

Autenticação de Usuário

Este é um ponto onde Elixir Phoenix está deficiente.

Rails tem o módulo Devise. Phoenix tem Coherence, no entanto, atualmente não é mantido.

Se você quiser usar um login básico com nome de usuário e senha, terá que construir cada passo disso. Isso inclui hash de senhas, lógica de redefinição de senha, configurações de 'lembrar-me', etc.

Isso é tedioso e carrega risco substancial de segurança.

Optei por usar Auth0, que funcionou bem com Phoenix. Talvez esta seja uma solução melhor de qualquer forma, mas teria sido bom ter tido uma escolha.

Implantação e Hospedagem

O principal host de aplicações Phoenix é Gigalixir, uma pequena empresa americana administrada por entusiastas de Elixir.

Gigalixir é hospedado no Google Cloud, então a infraestrutura subjacente é sólida.

O buildpack do Gigalixir torna a implantação fácil e suporta todas as estratégias inteligentes de implantação do Elixir (distillery, mix).

É mais caro do que 'faça você mesmo', mas a maior parte do custo está embrulhada na hospedagem de banco de dados Postgres.

Elixir Phoenix é tão leve que pode ser executado em pequenos pods docker e ainda lidar com um número muito saudável de requisições.

Apesar do markup, vale absolutamente a pena para tirar a dor de cabeça.

Vou apenas adicionar, o suporte ao cliente deles é excelente.

Disponibilidade de Programadores

Há substancialmente menos programadores Elixir por aí.

Elixir é uma "linguagem de programadores" - uma linguagem para a qual as pessoas vêm, tendo aprendido outra coisa.

Dito isso, aqueles que fazem Elixir são tipicamente melhores programadores. Talvez seja a escolha consciente de escolher uma linguagem melhor.

Me lembra os primeiros dias do Rails, onde parecia que apenas "rockstars" o usariam (versus PHP).

Qualquer bom programador Rails não terá problema em aprender Elixir Phoenix, e estará operacional dentro de alguns dias.

Eu Usaria Elixir Phoenix Novamente?

Definitivamente.

Trabalhei com muitas linguagens, e Elixir é a mais fácil e poderosa com a qual trabalhei.

Espero ansiosamente por escrever Elixir.

Rastreie 500 cliques mensais com todos os recursos incluídos.

Não é necessário cartão de crédito