Como entrar na Internet inteira em alguns minutos
Ok, talvez não inteira, mas em muitas páginas em bem pouco tempo.
A arquitetura apresentada aqui foi inspirada em ideias do magnífico livro Web Data Mining.
Eu tive a oportunidade perfeita de utilizar essa arquitetura em um projeto real (BuzzVolume) logo após ler o livro, em 2009. Apesar da maior parte do livro ser mais difícil, essa é relativamente fácil...
O BuzzVolume foi um serviço que organizava em listas de assuntos e popularidade os links compartilhados no Twitter.
Nós (eu e o Maurício) acessávamos a API em tempo real do Twitter (Firehose API) e filtrávamos tweets contendo "http" ou "https" ou seja, tweets com links!
Para resolver os redirecionamentos e capturar título e conteúdo principal do documento era necessário acessar cada URL.
URL (Uniform Resource Locator), é um termo técnico que foi traduzido para a língua portuguesa como “localizador uniforme de recursos”. É o endereço eletrônico...
Acessar um endereço por vez seria inviável. Não seria possível continuar recebendo os próximos tweets se parasse e esperasse a resposta de cada requisição HTTP.
Uma requisição HTTP é relativamente lenta e imprevisível. A arquitetura necessária para esse tipo de tarefa envolve processamento assíncrono e paralelo.
À medida que os links chegavam, nós os adicionávamos em uma fila em base de dados/estruturas chave-valor (na época usamos o Tokyo Cabinet mas o equivalente atual é o Redis). Assim um outro processo desacoplado (assíncronismo) tratava de realmente fazer a requisição HTTP.
Dessa forma foi possível abrir vários processos consumidores (paralelismo) para se manter a par da demanda.
Mas para realmente acessar a Internet inteira (ou talvez todos os imóveis de todas imobiliárias) os processos precisam consumir pouca memória (para permitir abrir vários) ou eles precisam serem capazes de paralelizar melhor o trabalho.
No ecossistema da linguagem Ruby, existe a ótima biblioteca typhoeus. É realmente como seus criadores descrevem: Uma versão moderna do código da besta mítica com 100 cabeças de serpente.
Outras linguagens possuem seus equivalentes (bibliotecas que encapsulem a libcurl ou padrões de processos leves).
Ah, você pode economizar tempo e bytes implementando reconhecer e aceitar "gzip". E se fizer muitas requisições para o mesmo domínio pode fazer cache do DNS.
Espero ter inspirado você a escrever algo poderoso!