Apps assíncronos com Tornado - API de pagamentos

Post on 17-Aug-2015

176 views 3 download

Transcript of Apps assíncronos com Tornado - API de pagamentos

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! arnaldo@luizalabs.com urbano@luizalabs.com

http://luizalabs.com

http://github.com/luizalabs

https://twitter.com/luizalabs

http://99jobs.com/luizalabs