Tiago Bonatti (ContaAzul)
Nesta palestra iremos conversar sobre boas práticas e soluções para os desafios da cultura de microserviços.
Vale do Carbono Conference
4. O que é
- Sistema grande e robusto
- Verdadeiro faz tudo.
- Muito comum até meados dos anos
2000
- Muitas desenvolvedores passaram
por ele
- Muito código escrito: Dificuldade de
manutenção
6. Estrutura: O que acaba acontecendo
F
I
N
A
N
C
E
I
R
O
E
S
T
O
Q
U
E
F
A
T
U
R
A
M
E
N
T
O
C
O
N
T
Á
B
I
L
APLICAÇÃO MONOLÍTICA - Fronteiras são ultrapassadas
- Dificuldade de manutenção
- Todo o código num único
lugar
- Mexeu aqui, quebrou ali
8. Tempo de build
- Compilação: ~20 minutos
- Testes unitários
- Testes de integração
- Liberação em produção: ~1 hora
- Criar novas máquinas
- Executar o blue/green
9. Fazendo uma analogia
- Os times enfrentavam filas para
fazer liberação em produção
- Desenvolvedores, POs, e os
clientes aguardavam
- Se alguém atrasar, todos sofrem
- Se alguém quebrar a master,
releases podem ser adiadas
- Não importa se era uma
correção de 3 linhas ou uma
feature de 1000.
11. Muito tempo de espera
- Uma hora por liberação
- Em média, duas liberações semanais por time
- Oito times na empresa
832 horas / 104 dias úteis
anuais gastos em tempo
de liberação...
12. Tecnologia
- Muitas tecnologias
- Struts
- RESTs / JAX-RS
- SQL Nativa
- JPQL
- Projetos são necessários para
atualizar algo
- Levam meses
- Nem sempre feito em
tempo hábil
14. O que é
- Conceito de Arquitetura
- Pequenos serviços
- Tem domínio da informação
- São independentes
- Falha parcial
15. Estrutura
Contas a Pagar
Emissão de Nota Fiscal
Controle de Estoque
Lançamento Contábil
- Código separado
- Comunicação geralmente feita
via REST
- Contratos bem definidos
- Banco de Dados
Independentes
- Um módulo, vira vários
microserviços
16.
17. Time: Cultura Ownership
- Composto por
- PO: Product Owner
- Team Leader
- UX: User Experience
- BackEnd
- FrontEnd
- Times pequenos
- Missão clara
18.
19. Fazendo uma analogia
- Compilação: ~4 minutos
- Testes unitários
- Testes de integração
- Liberação em produção: ~15
minutos
- Criar novas máquinas
- Executar o blue/green
- Um único time responsável
- Liberação constante
- Master quebrada impacta
somente os responsáveis
31. Como era o Projeto
Monolito Microserviço
jobs
admin
importer
32. Passo a passo de como separamos
- Eliminamos a dependência entre
as entidades, uma por uma
- Continuávamos usando os serviços
da Aplicação 1, a diferença é que não
tínhamos mais mapeamento direto
na entidade, agora os JOINs
fazíamos em outras queries.
- Trocamos os serviços para
utilizar REST mesmo estando
dentro do mesmo projeto
- Separamos a Aplicação 2 dentro
do mesmo repositório que a
37. Imagens Docker
Docker é uma plataforma Open
Source que facilita a criação e
administração de ambientes
isolados.
38. Microserviço Microserviço
Microserviço Microserviço
Deploy em Produção
APP
Instância
APP
Instância Instância Instância
APP APP
Instância Instância Instância Instância
APP APP APP APP
- Beanstalk da Amazon
- Cada microserviço possuía no
mínimo duas instâncias
- Rolling release
- Redundância
- Escalonamento de máquinas
- Scripts para deploy em
produção
41. Microserviço
Kubernetes: Deploy em Produção
APP
APP
Microserviço
APP
APP
APP
APP
APP
APP
Microserviço Microserviço
INSTÂNCIAINSTÂNCIAINSTÂNCIA
- Gerência aonde por as aplicações em
várias máquinas
- Distribui de forma inteligente as
aplicações
- Otimiza o custo das máquinas
- Possui
- Rolling release
- Health Check
- Comparado ao Beanstalk
- Deploy é mais rápido
- Custo 70% menor em Sandbox
- Custo 20% menor em produção
47. Circuit Breaker
- Comparado a um disjuntor
- Resiliência: Falhar
graciosamente
- Falhar rápido e isoladamente
- Fallback
- Uma camada de proteção em
cada requisição
- Se X% falhar em Y tempo, abre
circuito, após Y tempo tenta
novamente e caso deu certo
volta a fechar
50. Mensageria
- Não precisa aguardar o
processamento
- Ajuda a manter os domínios
- Um microserviço não precisa
conhecer outro
51.
52. E os vários bancos de dados...
- Pentaho Data Integration
- ETLs (Extract, Transform,
Load)
- Limpamos, agrupamos e
armazenamos em tabelas
específicas
- Não é realtime
- De hora em hora ou
minuto e minuto
- Crontab do linux para jobs
- Integramos com outros
serviços
54. - Melhoramos o tempo para liberação
- De ~1 hora para ~10 minutos
- Ownership
- Liberação constante
- Flexibilidade nas tecnologias
- Falha parcial
- Fronteiras definidas
Concluíndo
Geralmente eram separados por módulos
Continuam funcionalidades como Financeiro / Estoque / Faturamento
Coisas do financeiro são acessadas pelo faturamento
Facilmente é esquecido algo desse tipo, gerando retrabalho e bugs
Desenvolvimento: Novas features
Manutenção: Cuida do legado e bugs. Muitas vezes falta desafios
Infra: Dá suporte aos dois times
Geralmente temos 8 espaços por dia para liberação
Pode atrasar a sprint por causa de agenda
Essa agenda é respeitada desde a correção de um Bug de 3 linhas a uma feature de 300 linhas
Ou seja, you build it, you run it
Você desenvolve, você executa
Não usar um martelo no parafuso
Podemos experimentar várias linguagens.
A mais performática
A mais robusta
O pau para toda obra
Dilminha para Temerzinho
AB Go em Java
Homologar stacks
Pelas vantagens, decidimos usar microserviço
Agilidade na liberação
Tecnologicamente atualizado
Ownership
Escolhemos uma parte e quebramos ela
Tinhamos duas aplicações que queriamos separar
A aplicação 1 utilizava a aplicação 2
O projeto atual:
JAVA EE
Maven
Hibernate
Postgres
Um único banco de dados
O projeto gerou alguns stress:
Estimativa errada do tempo para separação
Concorrência com produto
E fizemos tudo isso com o carro andando.
Reduzimos o risco nas liberações
Ganhamos a médio / longo prazo
Primeiro temos que definir o que não é Docker. Docker não é um sistema de virtualização tradicional. Enquanto em um ambiente de virtualização tradicional nós temos um S.O. completo e isolado, dentro do Docker nós temos recursos isolados que utilizando bibliotecas de kernel em comum (entre host e container), isso é possível pois o Docker utiliza como backend o nosso conhecido LXC.
Para o monolito tínhamos scripts prontos para fazer Rolling release ou Blue / Green
Beanstalk possui
Rolling release
Escalar máquinas
Cada projeto possui seu script de deploy em prod
Estendem um script padrão
Desenvolvido pela Google
Orquestrador de Containers
Usamos variáveis de ambiente para chamar configurar o endereço de outros microserviços
Estamos começando a ter muitos microserviços e começa a ficar complicado controla-los
Estamos estudando para utilizar o Eureka da Netflix
Estava rodando OK
Todos contentes
Até que um dia o microserviço começou a ficar lento
Atenção: Nem tudo é alegria
Enquanto o homem planeja, Deus ri
Enquanto o Programador codifica, a aplicação cai
O monolito possuía uma chamada para o microserviço no Dashboard
Não deixar uma chamada externa derrubar sua aplicação
Desenvolvido pela Netflix e é open source
Thread Pool: Enfileira as requisições e descarta caso seja muitas
Exemplo do Track
Outro aprendizado foi fazer requisições parelelas
Requisições paralelas
Usamos muitas métricas, assim como qualquer startup
CSV
Pentaho Data Integration
Criamos ETLs (Extract, Transform, Load)
Limpamos, agrupamos armazenamos em tabelas específicas
Tiramos as métricas em cima deles
Não é realtime, tem um delay (Streamming)
jobs de hora em hora ou minuto e minuto
Crontab para jobs
Integramos serviços como Github / SalesForce / Hubspot
O que a ContaAzul está usando? (Faz sentido?)
Expertise nossa é o que vale a pena (Velocidade do time)