1
Varrendo APIs RESTem larga escalautilizando PHPAlexandre Gomes Gaigalas
PHP Conference 2010 – 26 de Novembro
22
Alexandre Gomes Gaigalas
● PHP 5
● OOP
● REST
● Linked Data
3
Kingo Labs
● Coleta e Análise de Dados
● Twitter, Facebook, Foursquare, etc
● Sorteie.me, trmanager, Kingo Meter, kingo.to,
rial.to, etc
● Ubuntu, PHP 5.3, MySQL, MongoDB
4
Programação de hoje● Por que varrer em larga escala?
● Processamento paralelo
● Daemons
● Processamento em fila
● Escalabilidade de escritas no banco de dados
● Backups
● Twitter: Características
● Facebook: Características
5
Por que varrer em larga escala?
● A API tem os dados que eu quero, mas não na
granularidade que eu quero.
● Quero pré-carregar dados ao invés de ler sob
demanda.
● Quero dominar o mundo e preciso dos dados dos
usuários.
6
Web Crawlers x Api Crawlers
● Muito DNS
● Heterogêneo (mimes)
● Gentil
● Pouco DNS
● Homogêneo (mimes)
● Agressivo
7
Processamento Paralelo com PHP
● pcntl_fork() - Fork de processos
● curl_multi_init() - Terceirizar o trabalho
● stream_select() - Streams assíncronas
8
pcntl_fork()
● Adeus, memória.
● Código confuso.
● Só funciona no Linux
● (não que eu use outro OS, mas sabe como é)
● ((multi-plataforma é uma característica do PHP, temos que
respeitar isso))
9
curl_multi_init()
● Requisições FTP/HTTP paralelas
● Simples
● Rápido
● Estável
● …mas espera as requisições completarem
sempre.
10
stream_select()
● Uma forma de percorrer várias streams sem locks
de leitura nem escrita.
● Qualquer plataforma.
● Qualquer stream (proc_open(), fopen(),
stream_socket_client(), etc.)
● Você tem que manipular o HTTP na unha.
11
RFC2616 – HTTP
Tanto o cliente quanto o servidor podem
interromper a conexão a qualquer momento.
12
Ferramentas
● KingoBase – Interna, experimental.
● Foi o projeto piloto de crawler.
● http://github.com/caferrari/SimpleCrawler
● Somente HTTP
● http://github.com/Respect/Stream
● Qualquer stream
13
Respect\Stream
14
Deamons com PHP
● PEAR System_Daemon
● System-V
● http://github.com/Respect/Daemon (em desenvolvimento)
● upstart
● Supervisord
● Ferramenta externa
15
Fila de processamento
● Processos engasgam
● Conexões caem
● APIs ficam indisponíveis
● Firewalls surtam
● Bancos de dados congelam
16
Fila de processamento
Twitter API
Queue
MongoDB
JSON.gz
JSON.gz
JSON.gz
17
Fila de processamento
Twitter API
Queue
MongoDB
JSON.gz
JSON.gz
JSON.gz
JSON.gz
JSON.gz
JSON.gz
JSON.gz
18
MySQL: Escalando Escritas
● InnoDB
● Transactions
● Partitions
● Batch Operations (1000+ INSERTS)
19
MySQL: Partitions
● Particionamento horizontal
● Diminui o tamanho dos índices
● Requer revisão das queries
20
MongoDB: Escalando EscritasPronto!
21
Pruning: Remover dados antigos
● MySQL
● ALTER TABLE twitter_status DROP PARTITION
p20091201;
● MongoDB
● db.createCollection(“twitter_status”, {capped:true,
size: 10240000});
22
Backup
● Esqueça mysqldump e mongodump!
● rsync
● ec2-create-snapshot (Amazon EC2)
23
Snapshots: MySQL
● FLUSH;
● LOCK TABLES;
● [snapshot do disco]
● UNLOCK TABLES;
24
Snapshots: MongoDB
● runCommand({fsync:1, lock:1});
● [snapshot do disco]
● db.$cmd.sys.unlock.findOne();
25
API do Twitter
● REST API
● Dados sob demanda
● Stream API
● Tweets em tempo real
26
Twitter: Limite de Requisições
● 150 Requisições por:
● Hora
● IP
● Usuário Autenticado (Oauth)
● Uma Stream aberta por IP e/ou Usuário
27
Twitter: Cursores
28
Twitter: Cursores
● twitter_scan_status
● user_id
● followers_cursor
● favorites_cursor
● lists_cursor
● etc
29
Twitter: Ferramentas
● Phirehose
● Para a Stream API
● Controla reconexões, erros, limites, etc
● http://phirehose.googlecode.com
● Twitter-Async
● Abstrai autenticação OAuth
● Faz requisições paralelas com curl_multi_init()
● https://github.com/jmathai/twitter-async
30
● Graph API
● OAuth 2.0
● SDK: http://github.com/facebook/php-sdk
● Docs: http://graph.facebook.com
● Real Time API
● PubSubHubbub
31
Facebook: Limites (não-oficial)
● 600 Requisições por:
● 10min
● Usuário autenticado (Oauth 2.0)
32
Facebook: Batch Request
33
Facebook: Metadata
34
Facebook: Cropping
35
Obrigado!
3636
Eu, aqui e ali.
● http://twitter.com/alganet
● http://github.com/alganet
● http://about.me/alganet
● http://gaigalas.net
Top Related