Programação

Twitter pede água pro banco de dados

25 de fevereiro de 2010 ás 18:02

Mas que Cassandra! Quantas twitadas você já deu? Mil? Duas mil? Dez mil? Bah… isso não é nada para um sistema de banco de dados parrudo processar em alguns segundos.

Imaginem agora que o Twitter recebe cerca de 50 milhões de tweets por dia. Bom… aí o papo já muda.

De fato, de aplicações web ninguém tem dó, e é por isso que o Twitter está buscando novas tecnologias de armazenamento de dados e abandonando o MySQL, que é a mesma tecnologia usada para armazenar este post aqui.

O MySQL é ótimo, duvidado por muitos, mas ótimo. É rápido, eficiente, estável e compacto… só que sua escalabilidade (capacidade de crescer rapidamente utilizando múltiplos servidores, por exemplo) não é das melhores que já foram inventadas.

twitter_dead

Aí os caras do Facebook desenvolveram um negócio chamado Cassandra, que funciona em Java – que por sua vez é mais baixo nível, conversa melhor com o computador e por isso fica mais leve. Os caras do Twitter gostaram desta tecnologia e agora estão vendo de migrar tudo, o que vai dar um bocado de trabalho mas vai fazer a empresa crescer com mais conforto e economizar muito em infra-estrutura.

O Cassandra é NoSQL (não segue o padrão SQL de requisição), e faz parte de uma nova geração de bancos de dados que funcionam de maneira diferente e criados devido ao crescimento ignorante de armazenamento de dados que a web 2.0 exige.

Fonte: BR-Linux.

Comente

Interativo
Vinicius Massuchetto
Analista de Sistemas


Pegando mensagens de vários usuários do Twitter com PHP

04 de novembro de 2009 ás 09:11

Como as histórias na internet não são somente passarinhos e borboletas, vou tentar colocar alguma coisa um pouco mais técnica no blog.

Começamos com o problema de pegar os twits de vários usuários no Twitter.

Cada pesquisa no Twitter nos fornece um feed XML que pode ser tratado por qualquer aplicação. Para ter os twits de vários usuários, podemos fazer uma pesquisa como:

http://search.twitter.com/search.atom?q=
+from%3Adjmauriciao+from%3Afelipeharmata
+from%3Aflavinha_rocha+from%3Aleo91rock

E se quisermos puxar os twits de algumas dezenas de pessoas para nossa página? Este feed do Twitter só nos possibilita fazer requisições de 140 caracteres, o que é sugestivo à ideia toda do negócio, não?

O esquema então é pegar um a um. Monta-se um vetor com o nome de todos os usuários:

$usuarios[] = 'djmauriciao';
$usuarios[] = 'felipeharmata';
$usuarios[] = 'flavinha_rocha';
$usuarios[] = 'leo91rock';

E jogá-los nesta função substituindo usuário e senha por algum válido no Twitter.

// @brief Função para ordenar os twits depois de serem capturados
// @param $t1 Data em formato ordenável
// @param $t2 Data em formato ordenável
// @return -1 Se a primeira data for maior
// @return 1 Se a primeira data for menor
function sort_twits($t1,$t2) {
	return ($t1['date'] > $t2['date']) ? -1 : 1;
}
 
// @brief Função para capturar os twits
// @param $users Vetor de usuários do Twitter
// @return Falso se der erro na conexão com o Twitter
// @return Um vetor com com os twits dos usuários se der tudo certo
function get_twitter_messages($users) {
	$j = 0;
	foreach($users as $user) {
		$twitter_url = 'http://search.twitter.com/search.atom?q='.$user;
		$uname = 'usuario';
		$pwd = 'senha';
 
		// Conectando no Twitter
		$curl_handle = curl_init();
		curl_setopt($curl_handle,CURLOPT_URL,"$twitter_url");
		curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
		curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
		curl_setopt($curl_handle,CURLOPT_USERPWD,"$uname:$pwd");
 
		// Se não conseguir conectar, retorna uma falha
		if (!$contents = curl_exec($curl_handle)) return false;
		curl_close($curl_handle);
		$contents = str_replace("twitter:", "", $contents);
 
		// Transforma o retorno em um objeto XML
		$xml = simplexml_load_string($contents);
 
		// Percorre o objeto pegando o que interessa
		foreach ($xml->entry as $entry) {
			print_r($entry);
			$twits[$j]['author'] = preg_replace('/\ .*/','',$entry->author->name);
			$twits[$j]['author_url'] = $entry->author->uri;
			$twits[$j]['avatar'] = $entry->link[1]->attributes()->href;
			$twits[$j]['date'] = date('Y-m-d H:i:s',strtotime($entry->published));
			$twits[$j]['content'] = $entry->content;
			$j++;
		}
	}
 
	// Ordena toda a galera
	usort($twits,'sort_twits');
	return $twits;
}

O vetor de retorno é o:

$twits (
	['author'] => Autor do twit
	['author_url'] => URL do Twitter para o autor
	['avatar'] => Imagem de perfil do autor
	['date'] => Data de publicação do twit
	['content'] => Conteúdo do twit
);

Basta então utilizá-lo para moldar o seu layout da maneira que você quiser.

Comente

Interativo
Vinicius Massuchetto
Analista de Sistemas