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.t...
4
Programaçãodehoje
● Por que varrer em larga escala?
● Processamento paralelo
● Daemons
● Processamento em fila
● Escalab...
5
Porquevarreremlargaescala?
●
A API tem os dados que eu quero, mas não na
granularidade que eu quero.
●
Quero pré-carrega...
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_sel...
8
pcntl_fork()
●
Adeus, memória.
●
Código confuso.
●
Só funciona no Linux
●
(não que eu use outro OS, mas sabe como é)
●
(...
9
curl_multi_init()
●
Requisições FTP/HTTP paralelas
●
Simples
●
Rápido
●
Estável
●
…mas espera as requisições completarem...
10
stream_select()
●
Uma forma de percorrer várias streams sem locks
de leitura nem escrita.
●
Qualquer plataforma.
●
Qual...
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/Simpl...
13
RespectStream
14
DeamonscomPHP
● PEAR System_Daemon
● System-V
● http://github.com/Respect/Daemon (emdesenvolvimento)
● upstart
● Superv...
15
Filadeprocessamento
●
Processos engasgam
●
Conexões caem
●
APIs ficam indisponíveis
●
Firewalls surtam
●
Bancos de dado...
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.createCollect...
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...
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...
30
Facebook
●
Graph API
●
OAuth 2.0
●
SDK: http://github.com/facebook/php-sdk
●
Docs: http://graph.facebook.com
●
Real Tim...
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...
Upcoming SlideShare
Loading in …5
×

Varrendo APIs REST em Larga Escala utilizando PHP

4,230 views

Published on

APIs em REST tornaram-se o padrão de facto para integração com grandes sistemas como Twitter, Facebook, Foursquare e LinkedIn.

Mostrarei como ir além do básico e extrair grandes quantidades de dados, processá-los e obter informações que não estariam disponíveis diretamente por essas APIs.

Varrendo APIs REST em Larga Escala utilizando PHP

  1. 1. 1 VarrendoAPIsREST emlargaescala utilizandoPHP Alexandre Gomes Gaigalas PHP Conference 2010 – 26 de Novembro
  2. 2. 22 AlexandreGomesGaigalas ● PHP 5 ● OOP ● REST ● Linked Data
  3. 3. 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. 4. 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. 5. 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. 6. 6 WebCrawlersxApiCrawlers ● Muito DNS ● Heterogêneo (mimes) ● Gentil ● Pouco DNS ● Homogêneo (mimes) ● Agressivo
  7. 7. 7 ProcessamentoParalelocomPHP ● pcntl_fork() - Fork de processos ● curl_multi_init() - Terceirizar o trabalho ● stream_select() - Streams assíncronas
  8. 8. 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. 9. 9 curl_multi_init() ● Requisições FTP/HTTP paralelas ● Simples ● Rápido ● Estável ● …mas espera as requisições completarem sempre.
  10. 10. 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. 11. 11 RFC2616–HTTP Tanto o cliente quanto o servidor podem interromper a conexão a qualquer momento.
  12. 12. 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. 13. 13 RespectStream
  14. 14. 14 DeamonscomPHP ● PEAR System_Daemon ● System-V ● http://github.com/Respect/Daemon (emdesenvolvimento) ● upstart ● Supervisord ● Ferramenta externa
  15. 15. 15 Filadeprocessamento ● Processos engasgam ● Conexões caem ● APIs ficam indisponíveis ● Firewalls surtam ● Bancos de dados congelam
  16. 16. 16 Filadeprocessamento Twitter API Queue MongoDB JSON.gz JSON.gz JSON.gz
  17. 17. 17 Filadeprocessamento Twitter API Queue MongoDB JSON.gz JSON.gz JSON.gz JSON.gz JSON.gz JSON.gz JSON.gz
  18. 18. 18 MySQL:EscalandoEscritas ● InnoDB ● Transactions ● Partitions ● Batch Operations (1000+ INSERTS)
  19. 19. 19 MySQL:Partitions ● Particionamento horizontal ● Diminui o tamanho dos índices ● Requer revisão das queries
  20. 20. 20 MongoDB:EscalandoEscritas Pronto!
  21. 21. 21 Pruning:Removerdadosantigos ● MySQL ● ALTER TABLE twitter_status DROP PARTITION p20091201; ● MongoDB ● db.createCollection(“twitter_status”, {capped:true, size: 10240000});
  22. 22. 22 Backup ● Esqueça mysqldump e mongodump! ● rsync ● ec2-create-snapshot (Amazon EC2)
  23. 23. 23 Snapshots:MySQL ● FLUSH; ● LOCK TABLES; ● [snapshot do disco] ● UNLOCK TABLES;
  24. 24. 24 Snapshots:MongoDB ● runCommand({fsync:1, lock:1}); ● [snapshot do disco] ● db.$cmd.sys.unlock.findOne();
  25. 25. 25 APIdoTwitter ● REST API ● Dados sob demanda ● Stream API ● Tweets em tempo real
  26. 26. 26 Twitter:LimitedeRequisições ● 150 Requisições por: ● Hora ● IP ● Usuário Autenticado (Oauth) ● Uma Stream aberta por IP e/ou Usuário
  27. 27. 27 Twitter:Cursores
  28. 28. 28 Twitter:Cursores ● twitter_scan_status ● user_id ● followers_cursor ● favorites_cursor ● lists_cursor ● etc
  29. 29. 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. 30. 30 Facebook ● Graph API ● OAuth 2.0 ● SDK: http://github.com/facebook/php-sdk ● Docs: http://graph.facebook.com ● Real Time API ● PubSubHubbub
  31. 31. 31 Facebook:Limites(não-oficial) ● 600 Requisições por: ● 10min ● Usuário autenticado (Oauth 2.0)
  32. 32. 32 Facebook:BatchRequest
  33. 33. 33 Facebook:Metadata
  34. 34. 34 Facebook:Cropping
  35. 35. 35 Obrigado!
  36. 36. 3636 Eu,aquieali. ● http://twitter.com/alganet ● http://github.com/alganet ● http://about.me/alganet ● http://gaigalas.net ● alexandre@gaigalas.net

×