Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Varrendo APIs REST em larga escala utilizando PHP

Varrendo APIs REST em larga escala utilizando PHP

Alexandre Gaigalas

November 06, 2011
Tweet

More Decks by Alexandre Gaigalas

Other Decks in Technology

Transcript

  1. 1 Varrendo APIs REST em larga escala utilizando PHP Alexandre

    Gomes Gaigalas PHP Conference 2010 – 26 de Novembro
  2. 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
  3. 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
  4. 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.
  5. 6 Web Crawlers x Api Crawlers • Muito DNS •

    Heterogêneo (mimes) • Gentil • Pouco DNS • Homogêneo (mimes) • Agressivo
  6. 7 Processamento Paralelo com PHP • pcntl_fork() - Fork de

    processos • curl_multi_init() - Terceirizar o trabalho • stream_select() - Streams assíncronas
  7. 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))
  8. 9 curl_multi_init() • Requisições FTP/HTTP paralelas • Simples • Rápido

    • Estável • …mas espera as requisições completarem sempre.
  9. 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.
  10. 11 RFC2616 – HTTP Tanto o cliente quanto o servidor

    podem interromper a conexão a qualquer momento.
  11. 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
  12. 14 Deamons com PHP • PEAR System_Daemon • System-V •

    http://github.com/Respect/Daemon (em desenvolvimento) • upstart • Supervisord • Ferramenta externa
  13. 15 Fila de processamento • Processos engasgam • Conexões caem

    • APIs ficam indisponíveis • Firewalls surtam • Bancos de dados congelam
  14. 21 Pruning: Remover dados antigos • MySQL • ALTER TABLE

    twitter_status DROP PARTITION p20091201; • MongoDB • db.createCollection(“twitter_status”, {capped:true, size: 10240000});
  15. 25 API do Twitter • REST API • Dados sob

    demanda • Stream API • Tweets em tempo real
  16. 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
  17. 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
  18. 30 Facebook • Graph API • OAuth 2.0 • SDK:

    http://github.com/facebook/php-sdk • Docs: http://graph.facebook.com • Real Time API • PubSubHubbub