Construindo uma plataforma de crédito com elixir

por Maurício Giacomini Girardello

Aqui na Bcredi, nossa agenda tem sido 100% focada em alcançar um modelo de crédito com garantia de imóvel completamente digital para revolucionar o mercado de crédito brasileiro. Além disso, queremos que empresas parceiras utilizem nossas tecnologias da forma mais simples possível, para crescermos juntos.

Nesse post, vou descrever um pouco da nossa stack e compartilhar como está sendo participar da evolução da plataforma Bcredi.

A arquitetura

Hoje nossa arquitetura é composta por aplicações desenvolvidas em python, ruby, R, mas a maior parte em Elixir, e se comunicam por meio de eventos utilizando RabbitMQ como solução de mensageria. Nossos serviços são deployados em um cluster kubernetes no Google Cloud.

Nem sempre foi assim, e a mudança para esse modelo começou acontecer no início de 2019. De forma gradual, conseguimos chegar em um nível mais maduro e com todos os serviços padronizados.

O movimento para essa arquitetura acabou sendo bem natural conforme as equipes foram crescendo. A grande vantagem desse movimento é que hoje todos trabalham com contextos diferentes e podem fazer entregas de forma independente, sem afetar o trabalho de outros times.

Como construímos nossas aplicações

Escolhemos a linguagem de programação Elixir. É uma linguagem com tipagem dinâmica, funcional e projetada para construir aplicações escaláveis e fáceis de manter.

O Elixir foi construído em cima da máquina virtual do Erlang que é muito conhecida por rodar sistemas distribuídos, tolerantes a falhas e com baixa latência. Por ser um runtime relativamente antigo, já foi muito testada e utilizada em sistemas críticos.

Uma das características que mais me atrai é a fácil manutenção e legibilidade do código

Por estarmos utilizando uma arquitetura distribuída, precisamos de uma forma inteligente de lidar com falhas, logo, o modelo de atores e a forma de desenhar as soluções resultam na simplicidade na hora de lidar com falhas sem a necessidade de tratar exceções e usar condicionais para tudo, deixando o código bem clean e robusto.

O modelo de atores é um modelo matemático para computação concorrente. Cada ator é um processo e a única forma de compartilhar informações entre os processos é por meio de mensagens. Além disso, o próprio Erlang entrega uma série de abstrações/bibliotecas (OTP) para escrever bons softwares utilizando esse modelo. Uma dessas abstrações é a árvore de supervisão, onde ela é responsável por inicializar, desligar e lidar com processos que estão falhando.

Estrutura de um processo:

Estrutura de uma árvore de supervisão, onde cada quadrado é um supervisor e cada bolinha um processo. Cada supervisor pode possuir estratégias diferentes para lidar com falhas.

Outra coisa legal é o paradigma funcional, que comparado a orientação a objetos, onde o estado é encapsulado em um objeto com métodos impuros, temos muito mais funções puras. Isso facilita muito a testabilidade e legibilidade do código.

O ferramental nativo da linguagem contempla praticamente tudo o que precisamos para operar nossos serviços, como o Mix, ExUnit, EEx, iEX e Logger.

  • O Mix é uma ferramenta de build que fornece uma forma simples de criar, compilar, gerenciar dependências e testar aplicações Elixir.
  • O ExUnit é o framework de testes (bem similar ao minitest do ruby), que fornece uma DSL muito simples e clara para escrever bons testes e paralelizar a execução dos mesmos.
  • EEx (Embedded Elixir) é uma biblioteca para construir templates de forma simples.
  • iEX é um shell interativo onde podemos executar funções e até mesmo visualizar documentação, mantendo o desenvolvedor mais tempo focado no terminal e menos no navegador.

Para fazer a comunicação entre os serviços utilizamos a biblioteca Conduit que entrega uma DSL muito simples e intuitiva para publicar e consumir eventos com suporte a várias tecnologias (kafka, sqs, amqp, etc).

Para serviços que precisam de endpoints HTTP utilizamos o phoenix framework.

Todos os serviços que precisam persistir dados em bancos de dados relacionais utilizam a biblioteca Ecto.

O bacana de tudo isso é que, praticamente, todas essas dependências que citei são mantidas pelo próprio `core-team` da linguagem, fornecendo um ecossistema maduro para a comunidade criar e resolver problemas utilizando bibliotecas confiáveis e até mesmo criar novas soluções.

Hoje é perceptível como a flexibilidade de utilizar micro serviços nos ajudam a evoluir os componentes de forma mais fácil, mas levou um bom tempo até essa percepção ser real. O amadurecimento do time também é um fator importante para que isso aconteça da forma correta, pois a manutenção fica mais complexa e é necessário apoio de todo mundo. 

Já em termos de código, muitos serviços antigos estão sendo desligados ou reescritos com uma visão mais madura das regras de negócio. Essa atitude resulta em códigos muito mais simples e fáceis de manter.

Além disso, comunidade do Elixir está evoluindo muito rápido e sempre trazendo novidades, tornando o dia-dia do desenvolvedor muito mais fácil :).

Bcredi

A Bcredi é uma fintech que oferece Crédito com Garantia de Imóvel com uma das menores taxas do Brasil, de um jeito descomplicado. Nossos conteúdos te ajudam a entender melhor o universo financeiro e a fazer melhores escolhas com o seu dinheiro!

Visualizar todas as publicações

Um jeito descomplicado de você acompanhar as novidades do nosso blog.

Comentários

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *