Competição Twitter ~ poupança de tweets (PHP e MySQL)

Estou criando um aplicativo para ajudar nossa equipe a gerenciar uma competição no Twitter. Até agora, consegui interagir com a API bem e devolver um conjunto de tweets que eu preciso.

Estou lutando para decidir sobre a melhor maneira de lidar com o armazenamento dos tweets no database, com a freqüência para verificar se eles e como garantir que não há sobreposições ou lacunas.

Você pode obter um número máximo de 100 tweets por página. No momento, minha idéia atual é executar um script cron, digamos, uma vez a cada 5 minutos ou mais e pegue um total de 100 tweets de cada vez, e passe-os olhando no db para ver se consigo encontrá-los antes de adicioná-los .

Isso tem a desvantagem óbvia de executar 100 consultas contra o db a cada 5 minutos e, no entanto, muitos INSERT também estão. O que eu realmente não gosto. Além disso, preferiria ter algo um pouco mais em tempo real. Como o twitter é um serviço ao vivo, é lógico que devamos atualizar nossa lista de participantes assim que eles entrarem.

Isso novamente traz uma desvantagem de ter repetidamente pesquisado o Twitter, o que, embora seja necessário, não tenho certeza de que eu quero marcanvasr sua API assim.

Alguém tem idéias sobre uma solução elegante? Preciso garantir que capture todos os tweets e não deixe ninguém sair e mantenha o usuário do db único. Embora tenha considerado apenas adicionar tudo e, em seguida, agrupar a tabela resultante pelo nome de usuário, mas não está arrumado.

Estou feliz em lidar com o lado da exibição das coisas separadamente, pois isso é apenas uma atração do mysql e exibição. Mas o design do backend está me causando dor de cabeça porque não consigo ver uma maneira eficiente de mantê-lo marcando sem marcanvasr nem o api nem o db.

A API do Twitter oferece uma API de transmissão que é provavelmente o que você quer fazer para garantir que você capture tudo: http://dev.twitter.com/pages/streaming_api_methods

Se eu entender o que você está procurando, você provavelmente quer um statuses/filter , usando o parâmetro da track com quaisquer características distintivas (hashtags, palavras, frases, locais, usuários) que você está procurando.

Muitas bibliotecas da API do Twitter têm isso construído, mas basicamente você mantém uma conexão HTTP aberta e o Twitter continuamente envia seus tweets à medida que eles acontecem. Veja a visão geral da API de transmissão para obter detalhes sobre isso. Se sua biblioteca não fizer isso por você, você precisará verificar conexões descartadas e reconectar-se, verificar os códigos de erro, etc. – está tudo na visão geral. Mas, adicionando-os à medida que eles entram, permitirá que você elimine completamente as duplicatas em primeiro lugar (a menos que você apenas permita uma input por usuário -, mas essas restrições do lado do cliente você resolverá mais tarde).

No que diz respeito ao não marcanvasr o seu database, uma vez que você tenha o Twitter apenas enviando coisas, você está no controle do seu fim – você poderia facilmente fazer com que seu cliente escondeu os tweets à medida que eles entram e, em seguida, escreva-os para o db em dado intervalos de tempo ou contagem – escreva o que for reunido a cada 5 minutos, ou escreva uma vez que tenha 100 tweets, ou ambos (obviamente esses números são apenas espaços reservados). Isto é, quando você pode verificar se há nomes de usuários existentes, se você precisar – escrever uma lista de cache permitiria a você a melhor chance de tornar as coisas eficientes, como quiser.

Atualização: minha solução acima é provavelmente a melhor forma de fazê-lo se quiser obter resultados ao vivo (o que parece que você faz). Mas, como mencionado em outra resposta, pode ser possível usar apenas a API de pesquisa para coletar as inputs após o término do concurso e não se preocupar em armazená-las – você pode especificar páginas quando você pede resultados (conforme descrito em o link da API da Pesquisa), mas há limites quanto a quantos resultados você pode obter no geral, o que pode fazer com que você perca algumas inputs. Qual solução funciona melhor para sua aplicação depende de você.

100 consultas em 5 minutos não são nada. Especialmente porque um tweet tem essencialmente apenas 3 peças de dados associadas a ele: ID do usuário, timestamp, tweet, tweet ID – digamos, cerca de 170 caracteres no valor de dados por tweet. A menos que você esteja executando seu database em um 4.88MHz 8088, seu database nem piscará nesse tipo de “carga”

Eu leio sua pergunta e parece-me que você deseja duplicar dados já armazenados pelo Twitter. Sem mais detalhes sobre a concorrência, a sua execução, como os usuários entram, por exemplo, quantidade estimada de inputs; é impossível saber se armazenar ou não esta informação localmente em um database é a melhor maneira de abordar esse problema.

Poderia ser uma solução melhor, salte o armazenamento de dados duplicados localmente e arraste os participantes diretamente do Twitter, ou seja, quando tentar encontrar um vencedor. Você pode eliminar inputs duplicadas on-the-fly, enquanto o código está sendo executado. Você só precisaria chamar “a próxima página” uma vez que ele acabou de processar as 100 inputs já obtidas. Apesar disso, não tenho certeza se isso é possível diretamente através da API do Twitter.

Eu acho que executar um cron a cada X minutos e basar isso na data de criação de tweets pode funcionar. Você pode consultar seu database para encontrar a última data / hora do último tweet gravado, então somente executar seleciona se há tempos de correspondência para evitar duplicatas. Então, quando você faz suas inserções no database, use uma ou duas instruções de inserção contendo todas as inputs que deseja gravar para manter a performance.

 INSERT INTO `tweets` (id, date, ...) VALUES (..., ..., ...), (..., ..., ...), ...; 

Isso não parece muito intenso … também depende do número de tweets que você espera gravar. Certifique-se também de indexar a tabela corretamente.