Escalando a 99Taxis§ão QCon...Apresentação Renato Freitas Engenharia POLI - USP...

Preview:

Citation preview

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 99cv@99taxis.com

Recommended