Varrendo APIs REST em Larga Escala utilizando PHP

36
1 Varrendo APIs REST em larga escala utilizando PHP Alexandre Gomes Gaigalas PHP Conference 2010 – 26 de Novembro

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 of Varrendo APIs REST em Larga Escala utilizando PHP

Page 1: Varrendo APIs REST em Larga Escala utilizando PHP

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

22

Alexandre Gomes Gaigalas

● PHP 5

● OOP

● REST

● Linked Data

Page 3: Varrendo APIs REST em Larga Escala utilizando PHP

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

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

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

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

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

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

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

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

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

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

13

Respect\Stream

Page 14: Varrendo APIs REST em Larga Escala utilizando PHP

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

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

16

Fila de processamento

Twitter API

Queue

MongoDB

JSON.gz

JSON.gz

JSON.gz

Page 17: Varrendo APIs REST em Larga Escala utilizando PHP

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

18

MySQL: Escalando Escritas

● InnoDB

● Transactions

● Partitions

● Batch Operations (1000+ INSERTS)

Page 19: Varrendo APIs REST em Larga Escala utilizando PHP

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

20

MongoDB: Escalando EscritasPronto!

Page 21: Varrendo APIs REST em Larga Escala utilizando PHP

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

22

Backup

● Esqueça mysqldump e mongodump!

● rsync

● ec2-create-snapshot (Amazon EC2)

Page 23: Varrendo APIs REST em Larga Escala utilizando PHP

23

Snapshots: MySQL

● FLUSH;

● LOCK TABLES;

● [snapshot do disco]

● UNLOCK TABLES;

Page 24: Varrendo APIs REST em Larga Escala utilizando PHP

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

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

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

27

Twitter: Cursores

Page 28: Varrendo APIs REST em Larga Escala utilizando PHP

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

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

30

Facebook

● 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

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

32

Facebook: Batch Request

Page 33: Varrendo APIs REST em Larga Escala utilizando PHP

33

Facebook: Metadata

Page 34: Varrendo APIs REST em Larga Escala utilizando PHP

34

Facebook: Cropping

Page 35: Varrendo APIs REST em Larga Escala utilizando PHP

35

Obrigado!

Page 36: Varrendo APIs REST em Larga Escala utilizando PHP

3636

Eu, aqui e ali.

● http://twitter.com/alganet

● http://github.com/alganet

● http://about.me/alganet

● http://gaigalas.net

[email protected]