Adotando o Elixir na Ingresse
Tags: elixir, ingresse, ptbr
Published: 2020-03-06 20:26:57

Com o crescimento acelerado da [Ingresse](https://www.ingresse.com/) nos últimos anos, tivemos que reformular nossa arquitetura e infraestrutura inicial para poder escalar com essa demanda.

A [Ingresse](https://www.ingresse.com/) nasceu com uma base em `PHP`, um [Monolito](https://pt.wikipedia.org/wiki/Aplica%C3%A7%C3%A3o_monol%C3%ADtica) que atendeu bem o MVP e os primeiros anos do produto, mas com o passar do tempo acabou dificultando a evolução dele.

No processo de reformulação da arquitetura em 2016 nasceram os primeiros serviços em `Python` que resolveram bem os problemas para qual a linguagem foi escolhida. No início de 2017 quando estávamos com uma *stack* com um misto de `PHP` e `Python` começamos a olhar para outras linguagens que nos ajudasse a escalar e aproveitar melhor todos os recursos disponíveis da nossa infra. Mas para essa linguagem a gente tinha um foco muito importante, ela tinha que ser *developer friendly*, estávamos buscando uma linguagem que nos ajudasse na escalabilidade e performance mas principalmente na produtividade do nosso time.


# Prova de conceito

Para começar fizemos uma prova de conceito de um [microserviço](https://www.redhat.com/pt-br/topics/microservices/what-are-microservices) novo implementando poucas *features*, mas desenvolvendo as mesmas *features* utilizando duas das linguagens que estávamos analisando. A idéia não era comparar só a performance do serviço entre essas duas linguagens, mas também, como é o dia a dia desenvolvendo com essas linguagens.


# Escolhendo o Elixir

Uma das linguagens escolhidas para o teste foi o [Elixir](https://elixir-lang.org/). Uma linguagem *open source* criada pelo José Valim na Plataformatec, empresa recentemente adquirida pelo Nubank.

O `Elixir` é uma linguagem moderna que executa na Máquina Virtual [Erlang](https://www.erlang.org/) (BEAM), conhecida por executar sistemas de baixa latência, distribuídos e tolerantes a falhas.

Além disso tem uma comunidade muito ativa e frameworks para desenvolvimento web como o [Phoenix](https://www.phoenixframework.org/) que tem foco em criar uma estrutura produtiva que não compromete a velocidade de desenvolvimento nem a manutenção.

Alguns pontos altos do `Elixir`:


#### Instalação simples

A instalação do `Elixir` é muito simples, tem instalador para [Linux](https://elixir-lang.org/install.html#unix-and-unix-like), [Mac](https://elixir-lang.org/install.html#macos), [Windows](https://elixir-lang.org/install.html#windows) e para quem prefere container como eu, imagens [Docker](https://elixir-lang.org/install.html#docker) para não sujar seu ambiente.


#### Documentação e conteúdo

A [documentação](https://hexdocs.pm/elixir/Kernel.html) é bem completa e fácil de navegar. O [site](https://elixir-lang.org/learning.html) da linguagem aponta diversos materiais de leitura, cursos e *screencasts* para quem quer começar. Tem muito material gerado pela comunidade, tanto aqui no [Dev.to](https://dev.to/search?q=elixir) quanto no [Medium](https://medium.com/search?q=elixir).

Um ótimo lugar para iniciar com conteúdo em português é o [ElixirSchool](https://elixirschool.com/pt/).


#### Gerenciador de pacotes

Uma coisa que a gente espera em todas as linguagens modernas é um gerenciador de pacotes decente. E esse é o caso do [Hex](https://hex.pm/), um gerenciador de pacotes para as linguagens que compilam para rodar na Maquina Virtual do Erlang (BEAM).


#### Ferramenta de *build*

O [Mix](https://hexdocs.pm/mix/Mix.html) é uma ferramenta de *build* que fornece *tasks* para criar, compilar e testar projetos `Elixir`, gerenciar suas dependências e muito mais. É uma ferramenta que facilita o dia a dia no desenvolvimento e nos processos de automatização.


#### Testes

O [ExUnit](https://hexdocs.pm/ex_unit/ExUnit.html) é um framework completo para testes no `Elixir`. Totalmente integrado para ser executado com um simples `mix test` e com capacidade de rodar os testes de forma assíncrona.


#### Produtividade

A velocidade de desenvolvimento no `Elixir` é muito boa. Tem um *syntax* que é fácil escrever um código limpo e compreensível sem sacrificar a produtividade de um desenvolvedor.


# Processo de mudança

Hoje ainda temos microserviços em outras linguagens rodando em produção, simplesmente porque estão dando conta do recado. Já até pensamos em migrar alguns mas se ainda estão funcionando bem não tem porque mexer.

Com o tempo o nosso time foi pegando pequenas tarefas para executar em `Elixir` até sentirem que tinham o domínio na linguagem para poder dar manutenção e criar novos microserviços do zero. A troca de conhecimento entre as equipes é essencial para que esse tipo de mudança tenha sucesso.

Com certeza não é um processo rápido adotar uma nova linguagem em produção, quando se tem uma quantidade enorme de acessos, mas acredito que os benefícios de ter uma linguagem moderna com um grande foco no desenvolvedor e na sua produtividade é um grande diferencial para a equipe e para o futuro da empresa.

Um dos nossos desenvolvedores Backend escreveu um [post](https://dev.to/leonimella/entendendo-elixir-com-ajuda-de-php-20n2) sobre `Elixir`, com uma visão de quem veio do `PHP`. Muito útil pra quem está tendo seu primeiro contato com a linguagem e com o paradigma funcional.


# Conclusão

Essa prova de conceito hoje se tornou um dos nossos principais serviços e está em produção desde o final de 2017.

Ele é responsável por transacionar **centenas de milhões de Reais** em ingressos todo ano, não só na [Ingresse](https://www.ingresse.com/) mas em outras "tiqueteiras" do mercado que utilizam nossas API's. É um *Gateway* de pagamentos, com múltiplos adquirentes e plataformas de pagamento integradas como `Cielo`, `Stone`, `Getnet`, `PicPay`, `StarkBank`, `Iugu` e `PayPal`.

Hoje todos os nossos serviços novos são desenvolvidos em `Elixir`. Até agora temos **5** deles em produção e no momento mais **3** sendo desenvolvidos em 2020.

Se já trabalha com `Elixir` ou estiver querendo aprender estamos sempre com [vagas abertas](https://sobre.ingresse.com/vagas).