Escalando a 99Taxis§ão QCon...Apresentação Renato Freitas Engenharia POLI - USP...
Transcript of Escalando a 99Taxis§ão QCon...Apresentação Renato Freitas Engenharia POLI - USP...
Escalando a 99Taxis Lados obscuros de uma arquitetura distribuída
Agenda● O que é 99Taxis● História da arquitetura● Arquitetura distribuida● O lado obscuro (problemas, erros)● Futuro● Q&A
Apresentação● Renato Freitas
○ Engenharia POLI - USP○ Empreendedorismo○ Ebah○ 99Taxis
● Giuliano Caliari○ Mestrado em engenharia de software POLI - USP○ Ciências da computação IME - USP○ 99Taxis
Contexto● 99Taxis● O que é● Como funciona
Contexto● Qual o tamanho da 99Taxis?
○ 300+ cidades○ 100k+ taxistas○ 3M+ usuários○ 1.5M+ corridas por mês
Principais requisitos● Tracking dos taxistas● Selecionar taxistas por localização● Mostrar infos
○ do taxista pro passageiro○ do passageiro pro taxista
Primeira versão● One man army● Monolito● Java● MySQL
Primeiras alterações● Primeira separação:
○ Oferta■ taxistas online
○ Demanda■ passageiros chamando táxi
○ Admin■ relatórios, tabelas, edição, etc
"Segundas" Alterações● Paralelização● Mover fila do banco● Memória compartilhada
○ Memcached○ Redis
Novos requisitos● Pagamento eletrônico● Sistema corporativo● Promoções e parcerias
Desafios Tecnicos● Eleger o melhor taxista para um passageiro
○ Analisar dados realtime○ Redes 3G○ Serviços externos
● Horários / eventos de pico (é chuva?)● Eventos desordenados
Arquitetura antiga
APIAPIAPI
MySQL
APIAPIDrivers Admin
Banco de dados compartilhado
● Alterações no banco são perigosas● Duplicação de código● Dev pains● Admin afetando performance da API
○ banco de réplica => preocupação de lag● Muita escrita no banco (pos, calls)
○ Solução: redis, escrita em batch
Serviços
● Problema do monolito. Dividir e conquistar.● Pagamentos e Corporativo. Pq SOA?
○ Testar a idéia com MVPs○ Testar isoladamente○ Introduzir Scala (exp, java, funcional, so sexy)
● Consequencias○ Solução foi melhor que o esperado○ Mini-monolitos distribuidos
Serviços○ Preocupações de rede: latência, falha
■ 2.4Mb de resposta, 1.9s timeout■ Implementações gzip
○ Novos endpoints para informações novas○ Ninguém mais quer trabalhar no sistema antigo
● Futuro○ Separar tipos de acessos Web/API/Bg○ Separar serviços
Arquitetura
MySQL
Drivers
AdminAPI
Corporativo
PostgreSQL
Redis
Redis
PostgreSQL
Pagamentos
Core
Duplicação de informações
● Como arquitetar informações?● Corridas propagadas para novos sistemas● Motivações
○ Isolamento dos sistemas: proteger API○ Falta de monitoramento: quanto afetaria API○ API delicada: fazer o mínimo de alterações ○ Modelagem anterior complexa
Duplicação de informações
● Consequencias○ Alterações precisavam ser replicadas○ Inconsistência nos dados
■ Manipulações / Interpretações diferentes● Cada um resolve o seu
■ Relatórios não batiam■ Falta de confiança nos dados
Duplicação de informações
● Solução?○ Mapa da informação com abordagem de micro-
serviço○ Agregador de dados imutáveis ○ Testando para 1 unidade de informação
Deploys ainda complexos
● Melhor mas preocupações existem○ Cuidado com deploy com versões incompatíveis
■ Rollback muito mais complexo■ Solução: deploys passo-a-passo
○ Ordem dos sistemas pode ser relevante○ Garantir versão igual○ Evitar deploy com mais de 1 feature
● Alguns ainda quase manual (legado)
Debug e Monitoramento● Como monitorar as diversas máquinas?
○ Máquina fantasma● O que monitorar / logar?
○ Tempo em filas => Configuração do SQS
Debug e Monitoramento● New Relic e Splunk
○ Monitoramento/Logs individuais○ Rastrear em diversos sistemas○ Informações e formatação diferentes
● Splunk agregando todos os sistemas○ Mesma formatação e info nos logs
Diversos
● Temos sistemas mais simples mas com iteração complexa ○ "When we break up big things into small pieces we invariably push the
complexity to their interaction"- Michael Feathers
● Sistemas sem responsável● "Estilo" de código não padronizado
Diversos
● Ambiente de teste/staging complexos● Difícil testar entre serviços● Script para rolling deploy
● Conclusão: estamos em transição, ainda temos mini-monolitos
Arquitetura Atual
MySQL
Drivers
AdminAPICorporativo
PostgreSQL
Redis
Redis
PostgreSQL
PostgreSQL
PostgreSQL PostgreSQL
Pagamentos
Promoções
Financeiro Corridas
Core
Perguntas?Perguntas?
Trabalhe na [email protected]