varrendo apis rest em larga escala utilizando php

Post on 04-Jun-2015

3.636 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

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

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: 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

● alexandre@gaigalas.net

top related