segunda-feira, 29 de julho de 2013

Arquitetura do NewsMonitor


Pra quem não conhece, o NewsMonitor é uma ferramenta para busca e monitoramento de notícias com alguns aspectos sociais. Ele surgiu a partir de um "pivot" do antigo busk.com, um leitor de notícias social aberto ao público. No NewsMonitor dá para salvar notícias em painéis organizados só por você ou curados com várias pessoas. Nossa base possui milhões de artigos, crescendo na faixa de 3 milhões por mês, então dá pra achar de tudo.

Nesse post vou mostrar partes da nossa arquitetura. Nossos servidores estão no EC2, apesar de sempre olharmos com carinho Linode e DigitalOcean, algumas facilidades do EC2 valem o preço "mais caro". O site em si usa LAMP (Linux, Apache, MySQL e PHP). Os serviços no backend são todos implementados em Scala com coisas menores em Python.

A escolha por Scala partiu do interesse depois que algumas grandes startups começaram a usá-la como linguagem principal: Twitter, LinkedIn, Foursquare. Scala tem todas as qualidades de Java e da JVM: bibliotecas pra tudo, tooling, IDEs, performance, ampla comunidade, base de desenvolvedores. Apesar de estar na JVM, Scala é uma linguagem muito mais sucinta e robusta do que Java. Muito dessas qualidades vêm das raízes funcionais da linguagem, mas isso deixo para outro post.

Notícias mais importantes em 23 de julho

Nossa arquitetura é composta de 3 sistemas:
  • Crawler - Tudo começa na coleta de notícias dos milhares de sites que temos em nossa base.
    • Ele é dividido em dois, o "Source Crawler" encontra todas as novas notícias a serem processadas e guarda numa fila (no Redis) enquanto em outras instâncias temos os "URL Crawlers" processando as notícias e inserindo no nosso banco de dados. Quando necessário, escalamos o número de Crawlers com Spot Instances.
    • O processamento da notícia consiste da extração de informações da página HTML como o título, corpo e imagem principal da notícia. Para essa tarefa usamos o Goose que funciona muito bem mesmo contra soluções baseadas em Machine Learning. Mas depois de certa inatividade do projeto e pull requests parados, resolvemos forkar e seguir nosso caminho.
      Hoje, o "nosso Goose" já tem centenas de modificações, especialmente na parte de encontrar a melhor imagem e melhorias de performance.
  • Stark - Esse sistema agrega todos os pós-processamentos que fazemos em cima das notícias.
  • Agrupamento de notícias
    • Agrupamento de notícias. Para cada notícia que entra em nosso banco de dados tentamos encontrar notícias similares sobre o mesmo assunto/evento. Por exemplo, agrupamos mais de 700 notícias (em português) que falam sobre o importante nascimento do bebê da Família Real Britânica. Dessa forma o usuário pode ver em um só lugar tudo sobre o assunto.
      O agrupamento também nos ajuda a montar nossa "capa" de forma 100% automática (mostrada na primeira imagem do post). Mostramos nela as notícias mais populares/importantes das últimas horas. Melhor que qualquer capa de portal :)
    • Classificador de tópicos. Para cada notícia atribuímos "tópicos" ou "conceitos" importantes presentes na notícia. Por exemplo, para a notícia Snowden vai permanecer no aeroporto de Moscou, diz advogado os tópicos encontrados são: Edward Snowden, Moscou, Rússia, Inteligência, Espionagem, Prism. Ainda estamos experimentando e aperfeiçoando para podermos usar essa informação na interface.
    • Classificador de língua e trending topics. São duas novas funcionalidades que estão sendo testadas no momento.
  • Máquina de Busca - Após o pós-processamento da notícia podemos indexar e deixá-la disponível em nossa busca.
    • Usamos o ElasticSearch (por baixo Lucene) para indexação e buscas das notícias. Escolhemos o ES principalmente pela facilidade de escalar shards, replicas e máquinas, além da API REST que simplifica bastante.
    • Como alguns devem ter imaginado, fazer uma busca simples (usando o ElasticSearch ou Lucene) numa base de dezenas de milhões de artigos não vai retornar bons resultados, por isso usamos o custom scoring do ES com algumas evidências para deixar o resultado o mais perfeito possível.
    • Temos um suggest as you type também:


Entre nossos próximos desafios estão:
  • Detecção de entidades. Para cada notícia saber quais entidades do mundo real são citadas. 
  • Recomendação de notícias. Já estamos testando internamente um sistema de recomendação de notícias baseado nas atividades do usuário dentro do NewsMonitor.
  • Classificação por categoria. Gostaríamos de classificar nossas notícias de acordo com uma taxonomia abrangente (ex: Política, Tecnologia, Economia) de forma automática.
  • Qualquer coisa interessante. Com uma base de mais com milhões de artigos de diversas línguas e 13M de imagens armazenadas, acho que sempre vamos ter coisas interessantes para criar e fazer!
  • Encontrar pessoas qualificadas que queiram trabalhar com essas tecnologias. Ficou interessado? Envie-nos seu curriculum (felipe.hummel at spixdiscovery.com)!

Nenhum comentário: