1
VarrendoAPIsREST
emlargaescala
utilizandoPHP
Alexandre Gomes Gaigalas
PHP Conference 2010 – 26 de Novembro
22
AlexandreGomesGaigalas
●
PHP 5
●
OOP
●
REST
●
Linked Data
3
KingoLabs
●
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çãodehoje
● 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
Porquevarreremlargaescala?
●
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
WebCrawlersxApiCrawlers
●
Muito DNS
●
Heterogêneo (mimes)
●
Gentil
●
Pouco DNS
●
Homogêneo (mimes)
●
Agressivo
7
ProcessamentoParalelocomPHP
●
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 é umacaracterísticado PHP, temosque
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
RespectStream
14
DeamonscomPHP
● PEAR System_Daemon
● System-V
● http://github.com/Respect/Daemon (emdesenvolvimento)
● upstart
● Supervisord
● Ferramenta externa
15
Filadeprocessamento
●
Processos engasgam
●
Conexões caem
●
APIs ficam indisponíveis
●
Firewalls surtam
●
Bancos de dados congelam
16
Filadeprocessamento
Twitter API
Queue
MongoDB
JSON.gz
JSON.gz
JSON.gz
17
Filadeprocessamento
Twitter API
Queue
MongoDB
JSON.gz
JSON.gz
JSON.gz
JSON.gz
JSON.gz
JSON.gz
JSON.gz
18
MySQL:EscalandoEscritas
●
InnoDB
●
Transactions
●
Partitions
●
Batch Operations (1000+ INSERTS)
19
MySQL:Partitions
●
Particionamento horizontal
●
Diminui o tamanho dos índices
●
Requer revisão das queries
20
MongoDB:EscalandoEscritas
Pronto!
21
Pruning:Removerdadosantigos
●
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
APIdoTwitter
●
REST API
●
Dados sob demanda
●
Stream API
●
Tweets em tempo real
26
Twitter:LimitedeRequisiçõ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
● Paraa Stream API
● Controlareconexões,erros,limites,etc
● http://phirehose.googlecode.com
● Twitter-Async
● Abstraiautenticação OAuth
● Faz requisiçõesparalelascomcurl_multi_init()
● https://github.com/jmathai/twitter-async
30
Facebook
●
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:BatchRequest
33
Facebook:Metadata
34
Facebook:Cropping
35
Obrigado!
3636
Eu,aquieali.
●
http://twitter.com/alganet
●
http://github.com/alganet
●
http://about.me/alganet
●
http://gaigalas.net
●
alexandre@gaigalas.net

Varrendo APIs REST em Larga Escala utilizando PHP