Webstore Reloaded A arquitetura do walmart.com.br remodelada
Agenda
§ Mudança de Filosofia. § Missão § Problemas § Premissas § Estratégia § Sacadas § Solução § Eventos e Lições § Resultados e Rumos Futuros
Problemas
§ Tempo de resposta muito alto (segundos). § Experiência de usuário comprometida. § Evasão de usuários. § Ciclo Vicioso: + lento = + reloads = + carga.
§ Baixa escalabilidade. § Aplicação “aguenta lenta”.
§ Imprevisibilidade.
Problemas
§ Baixa reutilização. § Difícil de criar novas plataformas. § Código difícil de manter.
§ Alto consumo de recursos. § SOLR usado como search engine e cache. § Banco de dados com picos de 100% de utilização.
§ Pouco controle do web cache. § Difícil de expurgar objetos. § Difícil de mudar tempo de vida.
Premissas
§ Picos § Usuários Simultâneos: 300K § Consumo de Rede: 1Gb.
§ Disponibilidade § 99,9%
§ Tempo de resposta § T < 500 Milisegundos.
§ Escalabilidade § Horizontal § Near Linear
Premissas
§ Utilização de Recursos § Desonerar Banco de Dados. § Desonerar SOLR. § Diminuir número de servidores.
§ Código § Facilidade de desenvolver. § Alto grau de reutilização.
§ Usar soluções Open Source.
Estratégia
§ Objetivo 1: Página de Detalhe de Produto. § Maioria dos serviços usados pelo catálogo.
• Preço, parcelamento, disponibilidade, etc. § Conseguimos validar toda a solução. § Análise de cada componente.
• De onde recuperamos essas informações? • Quanto tempo elas podem ficar em cache?
§ Objetivos seguintes: Demais Páginas.
Sacadas
§ Fazer o básico: expor tudo como serviços. § Reutilização e “RESTificação” ao extremo. § Business as a Service. § Render as a Service. § Search as a Service.
§ Criar modelo de domínio independente. § Anteparo às mudanças. § Jobs de alimentação do modelo. § Idas ao banco de dados como exceção.
Sacadas
§ Caches mais inteligentes. § Mais níveis de cache. § Controles mais granulares. § Inteligência nos tempos de vida.
§ Melhor Distribuição das Tarefas. § Dados. § Negócio. § Renderização.
Cache - Browser
§ Quando possível, o browser resolve localmente. § Response Headers (max-age, etc.). § Recursos estáticos com TTL alto. § Melhor se for infinito.
§ Requisições Ajax com TTL mais baixo. § Diminui custos com CDN.
Cache - Akamai
§ Prós: § CDN § Diminui o tráfego à nossa infra.
§ Contras: § Lento. § Às vezes, vai pelo exterior. § Menor controle do cache.
Cache - Varnish
§ Maior controle do cache. § Desonera a renderização. § Cache de fragmentos da página (ESIs). § Cada fragmento tem um TTL específico.
Cache - Redis
§ Utilização § Cache dos resultados das chamadas aos serviços. § Modelo de dados desacoplado.
§ Desonera o banco de dados.
§ Por quê? § Armazenamento em memória. § Aguenta muita porrada. § Tempo de resposta muito baixo. § Pode persistir. § Independe das linguagens usadas.
Renderização - Overview
Controlador
Orquestração
Renderização
Cache
Data Fetcher
Template Engine
Repositório Templates
Renderização - Template Engine
§ Javascript § Linguagem natural dos webdevs. § Executada no cliente e no servidor. § Muito flexível.
§ Dust JS § http://linkedin.github.io/dustjs/ § Alta performance. § Herança de templates, partials, subtemplates, etc. § Operações assíncronas. § Streaming = baixo consumo de memória. § Fácil customização.
Renderização - Nodejs
§ Javascript server side. § Orientado a eventos. § Alta performance. § Baixo consumo de recursos. § Comunidade forte (NPM). § Vários pacotes: § ExpressJS, Redis, SOLR, Socket I.O
Renderização - Fluxo § /render/sku,offers,buy_button/11/ecommerce__sku_price_buy
§ Projeções § sku § offers § buy_button
§ Id § 11
§ Template § ecommerce/sku_price_buy
Serviços - Tecnologias
§ Spring on Jetty. § Security, Data, Scheduler, Jedis.
§ Resteasy. § Exposição dos serviços REST. § Documentação com Wsdocs ou Swagger.
§ REST e Web Socket Services § In-memory caches.
Eventos
§ Primeiro Release: Rollback! § ESIs em branco. § keep-alive no ExpresJs.
§ Segundo Release: Memory leak! § Node Cluster como paleativo. § NodeTime para ajudar. § Appender syslog no NodeJS.
§ Primeira Promoção: Crash! § TTL infinito para objetos inaquedos. § Redis irresponsivo.
Lições Aprendidas
§ Feature rollout. § Replicação de Tráfego + Teste Longo. § Memory leaks. § Condições de produção.
§ NodeJS § Cenários de muitas chamadas remotas.
§ Orquestrador, API gateway. § Pouco processamento. § Muita flexibilidade. § Javascript rules! :D
Lições Aprendidas
§ Twemproxy + Redis § Espalhar as chaves entre vários servidores. § Diminuir riscos ao perder um servidor.
§ Web Socket Services § Throughput mais de 2X maior!
§ Backoffice § Fundamental para alimentar o modelo independente.
Resultados
§ Teste de Carga § Blazemeter.com § Até 45.000 usuários simultâneos. § Sem passar pela Akamai. § Página de departamento. § Páginas dos produtos. § 10.000 possibilidades para cálculo de preço. § 15 segundos de thinking time. § Todos os cookies da requisição.
O que vem por aí…
§ Controle total do cache. § API Server. § Web Socket Services. § In-Memory Caches. § Infinispan. § Big Memory.
§ Client Side Render. § Muitas surpresas… :D