Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Apps assíncronos com Tornado - API de pagamentos

Apps assíncronos com Tornado - API de pagamentos

Apresentado por Daniel Urbano e Arnaldo Pereira no TDC São Paulo, 2015.

Como usar Tornado para escrever apps mais eficientes, desenvolvidos tão rapidamente quanto apps síncronos, ilustrado com case de API de pagamentos de uma grande enterprise.

"Escrever apps que funcionam de forma assíncrona pode ser muito simples em Python e traz benefícios, como uma maior vazão de requisições atendidas por processo e um número menor de processos por servidor. Mostraremos as libs que usamos e as que criamos no desenvolvimento do serviço da API de pagamentos utilizada no Magazine Luiza, que usa uma estratégia mista entre operações síncronas e assíncronas. Tecnologias: Tornado, SQL Alchemy, MySQL, AWS SQS, AWS S3."

More Decks by Arnaldo de Moraes Pereira

Other Decks in Technology

Transcript

  1. Quem somos Arnaldo de Moraes Pereira C, Python, Golang Predicta,

    startups Daniel Urbano Ruby, Python Bioritmo, Abril
  2. LuizaLabs P&D do Magazine Luiza ~70 pessoas 177 projetos no

    github 12 forks / projetos open source TI dos canais de venda
  3. API de pagamentos Buddy Rich “Tipo um proxy, em até

    2 semanas estará pronto” Receita do Magazine em 2014: > R$ 12 BI Apenas site: ~20% Precisa ser PCI compliant (wtf?)
  4. Como funciona? Site -> Buddy -> Gateway Gateway -> Adquirente

    -> Bandeira -> Emissor/Banco Buddy -> Análise de Risco Buddy -> Site
  5. Web: Tornado Eficiente, estável, escalável Simples - se bem escrito!

    Transição simples de sync pra async Django -> Tornado Não faz mágica Usamos há anos
  6. O que é Tornado? Web server e framework Library assíncrona

    Usa nonblocking networking IO Um dos primeiros web frameworks assíncronos twisted
  7. Async http client: 1 request class MyHandler(RequestHandler): @gen.coroutine def get(self):

    http_client = AsyncHTTPClient() response = yield http_client.fetch("http://example.com")
  8. Async http client: 1+n requests class MyHandler(RequestHandler): @gen.coroutine def get(self):

    http_client = AsyncHTTPClient() response1, response2 = yield [http_client.fetch(url1), http_client.fetch(url2)]
  9. Buddy Rich mais sobre a stack Ansible: provisionamento de ambientes

    AWS EC2, DynamoDB, RDS, SQS, S3 SQLAlchemy scoped session, criada no hook 'prepare' do RequestHandler Newrelic, logentries, notificações para o slack
  10. Buddy Rich problemas Comunicação com o Gateway de pagamento a

    lib de integração existente é síncrona
  11. Buddy Rich soluções Fork da lib de integração com o

    gateway Melhorias Async com AsyncHTTPClient logging PCI-compliant Junto criamos o asyncreplay
  12. Buddy Rich problemas Muitos timeouts no gateway de pagamento Isso

    não pode impedir a compra Como receber sem receber?
  13. Buddy Rich soluções Fluxo de aceite do pagamento e pós-processamento

    Dados do cartão salvos de forma segura Worker async os consome e adiciona ao início do fluxo Buddy notifica resultado do pós- processamento quando o tiver Tipo um Future para pagamento
  14. O que não foi legal MUITAS regras de negócio no

    processo Necessidade de sempre lidar com erros de terceiros Buracos no fluxo foram descobertos apenas em produção
  15. O que foi legal LuizaLabs agora usa frameworks assíncronos (Tornado,

    Cyclone e Asyncio) com tanta naturalidade quanto usa Django Deployments sem qualquer downtime Muitos testes unitários e de integração Testes que fazem sentido