varrendo apis rest em larga escala utilizando php
DESCRIPTION
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.TRANSCRIPT
![Page 1: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/1.jpg)
1
Varrendo APIs RESTem larga escalautilizando PHPAlexandre Gomes Gaigalas
PHP Conference 2010 – 26 de Novembro
![Page 2: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/2.jpg)
22
Alexandre Gomes Gaigalas
● PHP 5
● OOP
● REST
● Linked Data
![Page 3: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/3.jpg)
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
![Page 4: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/4.jpg)
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
![Page 5: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/5.jpg)
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.
![Page 6: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/6.jpg)
6
Web Crawlers x Api Crawlers
● Muito DNS
● Heterogêneo (mimes)
● Gentil
● Pouco DNS
● Homogêneo (mimes)
● Agressivo
![Page 7: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/7.jpg)
7
Processamento Paralelo com PHP
● pcntl_fork() - Fork de processos
● curl_multi_init() - Terceirizar o trabalho
● stream_select() - Streams assíncronas
![Page 8: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/8.jpg)
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))
![Page 9: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/9.jpg)
9
curl_multi_init()
● Requisições FTP/HTTP paralelas
● Simples
● Rápido
● Estável
● …mas espera as requisições completarem
sempre.
![Page 10: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/10.jpg)
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.
![Page 11: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/11.jpg)
11
RFC2616 – HTTP
Tanto o cliente quanto o servidor podem
interromper a conexão a qualquer momento.
![Page 12: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/12.jpg)
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
![Page 13: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/13.jpg)
13
Respect\Stream
![Page 14: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/14.jpg)
14
Deamons com PHP
● PEAR System_Daemon
● System-V
● http://github.com/Respect/Daemon (em desenvolvimento)
● upstart
● Supervisord
● Ferramenta externa
![Page 15: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/15.jpg)
15
Fila de processamento
● Processos engasgam
● Conexões caem
● APIs ficam indisponíveis
● Firewalls surtam
● Bancos de dados congelam
![Page 16: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/16.jpg)
16
Fila de processamento
Twitter API
Queue
MongoDB
JSON.gz
JSON.gz
JSON.gz
![Page 17: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/17.jpg)
17
Fila de processamento
Twitter API
Queue
MongoDB
JSON.gz
JSON.gz
JSON.gz
JSON.gz
JSON.gz
JSON.gz
JSON.gz
![Page 18: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/18.jpg)
18
MySQL: Escalando Escritas
● InnoDB
● Transactions
● Partitions
● Batch Operations (1000+ INSERTS)
![Page 19: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/19.jpg)
19
MySQL: Partitions
● Particionamento horizontal
● Diminui o tamanho dos índices
● Requer revisão das queries
![Page 20: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/20.jpg)
20
MongoDB: Escalando EscritasPronto!
![Page 21: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/21.jpg)
21
Pruning: Remover dados antigos
● MySQL
● ALTER TABLE twitter_status DROP PARTITION
p20091201;
● MongoDB
● db.createCollection(“twitter_status”, {capped:true,
size: 10240000});
![Page 22: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/22.jpg)
22
Backup
● Esqueça mysqldump e mongodump!
● rsync
● ec2-create-snapshot (Amazon EC2)
![Page 23: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/23.jpg)
23
Snapshots: MySQL
● FLUSH;
● LOCK TABLES;
● [snapshot do disco]
● UNLOCK TABLES;
![Page 24: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/24.jpg)
24
Snapshots: MongoDB
● runCommand({fsync:1, lock:1});
● [snapshot do disco]
● db.$cmd.sys.unlock.findOne();
![Page 25: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/25.jpg)
25
API do Twitter
● REST API
● Dados sob demanda
● Stream API
● Tweets em tempo real
![Page 26: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/26.jpg)
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
![Page 27: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/27.jpg)
27
Twitter: Cursores
![Page 28: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/28.jpg)
28
Twitter: Cursores
● twitter_scan_status
● user_id
● followers_cursor
● favorites_cursor
● lists_cursor
● etc
![Page 29: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/29.jpg)
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
![Page 30: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/30.jpg)
30
● Graph API
● OAuth 2.0
● SDK: http://github.com/facebook/php-sdk
● Docs: http://graph.facebook.com
● Real Time API
● PubSubHubbub
![Page 31: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/31.jpg)
31
Facebook: Limites (não-oficial)
● 600 Requisições por:
● 10min
● Usuário autenticado (Oauth 2.0)
![Page 32: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/32.jpg)
32
Facebook: Batch Request
![Page 33: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/33.jpg)
33
Facebook: Metadata
![Page 34: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/34.jpg)
34
Facebook: Cropping
![Page 35: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/35.jpg)
35
Obrigado!
![Page 36: Varrendo APIs REST em Larga Escala utilizando PHP](https://reader035.vdocuments.net/reader035/viewer/2022062405/55700572d8b42a84618b5386/html5/thumbnails/36.jpg)
3636
Eu, aqui e ali.
● http://twitter.com/alganet
● http://github.com/alganet
● http://about.me/alganet
● http://gaigalas.net