Upload
arnaldo-pereira
View
177
Download
3
Embed Size (px)
Citation preview
Apps assíncronos com TornadoCase: Buddy Rich, API de pagamentos
Quem somosArnaldo de Moraes Pereira
C, Python, Golang
Predicta, startups
Daniel Urbano
Ruby, Python
Bioritmo, Abril
LuizaLabs
P&D do Magazine Luiza
~70 pessoas
177 projetos no github
12 forks / projetos open source
TI dos canais de venda
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?)
Como funciona?
Site -> Buddy -> Gateway
Gateway -> Adquirente -> Bandeira -> Emissor/Banco
Buddy -> Análise de Risco
Buddy -> Site
O que usar?
Java?
Ruby?
PHP?
O que usar?É claro.
Stack
Simples
Eficiente, estável, escalável
Seguro
Transacional
Divertido
Web: TornadoEficiente, 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
O que é Tornado?Web server e framework
Library assíncrona
Usa nonblocking networking IO
Um dos primeiros web frameworks assíncronos
twisted
Async http client: 1 request
class MyHandler(RequestHandler): @gen.coroutine def get(self): http_client = AsyncHTTPClient() response = yield http_client.fetch("http://example.com")
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)]
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
Buddy Rich problemas
Comunicação com o Gateway de pagamento
a lib de integração existente é síncrona
Buddy Rich soluções
Fork da lib de integração com o gateway
Melhorias
Async com AsyncHTTPClient
logging PCI-compliant
Junto criamos o asyncreplay
Buddy Rich problemas
Muitos timeouts no gateway de pagamento
Isso não pode impedir a compra
Como receber sem receber?
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
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
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
O que foi legal
Retentativa automática de transações anteriormente "perdidas"
Aumento da conversão no checkout do site! $_$
Obrigado! [email protected] [email protected]
http://luizalabs.com
http://github.com/luizalabs
https://twitter.com/luizalabs
http://99jobs.com/luizalabs