Giter Club home page Giter Club logo

desafio-backend-intera's Introduction

Desafio Backend INTERA

Repostório com a solução implementada do desafio de backend da Intera.

ATENÇÃO: ALGUNS COMANDOS OU SCRIPTS NÃO FUNCIONARAM CORRETAMENTE NO WINDOWS

Estruturação

A solução completa, desde da a infra com terraform até o código das lambdas, está neste repositório. Escolhi trabalhar com monorepo simplesmente por ser mais fácil acompanhar alterações em cada serviço e infra sem ficar me perdendo entre vários repositórios desnecessariamente.

Arquitetura

A minha proposta está baseada fortemente em microserviços, porém foi propositalmente simplificado para um melhor resultado dado o tempo x qualidade.

Diagrama geral

diagrama

Temos inicialmente 2 microserviços e 1 serviço de Match:

  • Talents - responsável pelo banco de talentos
    • server: servidor http REST ou GRaphQL simples para CRUD com comunicação de escrita via fila SQS.
    • worker: ouve mensagem de escrita via fila SQS, valida e escreve no banco de talentos.
  • Openings - responsável pelo banco de vagas e requisitos
    • server: servidor http REST ou GRaphQL simples para CRUD com comunicação de escrita via fila SQS.
    • worker: ouve mensagem de escrita via fila SQS, valida e escreve no banco de vagas.
  • Match - responsável pelo match entre talentos e vagas disponíveis
    • Worker: verifica alterações no banco, informados pelo talents e openings e faz o match.

Cada serviço possui um arquivo README.md com mais informações e instruções.

Tecnologias utilizadas

  • NodeJS (^v14.15.4)
  • Terraform (v0.14.4)
  • AWS Lambda
  • AWS DynamoDB
  • AWS SQS

Limitações no escopo

  • Não foi considerado vagas remotas
  • Foi limitado a localidade da vaga para quem mora na mesma cidade e estado
  • Não foi considerado experiência ou categoria (senior, pleno, junior, etc.) para realizar o match, apesar de existir no banco de dados

Mas e os testes?

Reconheço a importância de se ter testes em cada serviço, porém devido ao tempo e minha viagem esse item eu fiquei devendo. Fica como um dos pontos de melhoria.

Pontos importantes

  • Índice do DynamoDB. Atualmente as tabelas do DynamoDB possui apenas 1 chave de hash, porém está longe de ser o ideal. Uma melhoria a se propor seria uma ou mais chaves de classificação, para separar os dados de acordo com tais informações. Ex: Se for importante a localidade da vaga x localidade do talento, daria para colocar o município como chave de classificação, ou talvez uma tupla de estado e município.
  • O match também está longe de ser ideal com uma lambda, o ideal seria utilizar algo que os interessados no match poderiam ser informados por uma subscription. Ex: AWS SNS, onde ao acontecer um match um evento seja disparado e os "ouvintes" informados.
  • Há uma taxa considerável de duplicação de código, o ideal seria trabalhar com um maior desacoplamento transferindo responsabilidades para um serviço em comúm. Ex: Utilizar uma arquitetura hexagonal separando completamente a parte de business da parte de entrada/saída de dados.
  • Abusar do paradigma funcional. Esse ponto não chega ser extremamente relevante, porém eu acredito em uma maior previsibilidade no paradigma funcional. Mas independente do paradigma dá para se ter micro serviços bem feitos com boa testabilidade.
  • A linguagem JavaScript é bastante produtiva mas sempre é um risco obter erros em runtime. Sempre fui entusiasta do TypeScript justamente para reduzir erros que geralmente são resolvidos com uma "compilação" com checagem de tipos.

Build e deploy

Cada serviço tem seu próprio projeto Node isolado e cada um possui os scripts:

  • Build: npm run build:lambda
  • Verificação de conformidade com linter: npm run lint

O build lambda terá como resultado um arquivo dentro da pasta dist chamado latest.zip, onde contém todo o fonte da lambda que está pronto para upload na sua respectiva pasta do bucket.

Terraform

Para criar a infraestrutura,, siga os passos de infrastructure.

Lembre-se: cada serviço, após o build, gera uma pasta dist que possui de fato o código que irá para produção.

Usando o serviço

Acesse a conta da AWS quando fizer todo processo de deploy, vá no serviço AppSync. A api criada estará disponível, entre nela e clique em "Consultas" para acessar o Playground.

Há alguns exemplos de mutations em examples/mutations.graphql. Para ver o match vá no CloudWatch > Grupo de logs > /aws/lambda/intera_match_lambda e lá estará saindo os logs com os matches e o match value de cada um.

Autor

David Vilaça - davidpvilaca

desafio-backend-intera's People

Contributors

davidpvilaca avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.