Twitter não manda mais SMSs para o Brasil

Pelo menos por enquanto, o serviço de envio de SMSs gratuítos para usuários do Twitter no Brasil foi desativado. Motivo? A conta ficou cara. Porque, obviamente, alguém tinha que pagar a conta (there is no free lunch…).

Os usuários do Twitter cadastrados no serviço de SMS estão recebendo o seguinte email:

Hi,

I’m sending you this note because you registered a mobile device to work with Twitter over our UK number. I wanted to let you know that we are making some changes to the way SMS works on Twitter. There is some good news and some bad news.

I’ll start with the bad news. Beginning today, Twitter is no longer delivering outbound SMS over our UK number. If you enjoy receiving updates from Twitter via +44 762 480 1423, we arerecommending that you explore some suggested alternatives.

Why are we making these changes?

Mobile operators in most of the world charge users to send updates. When you send one message to Twitter and we send it to ten followers, you aren’t charged ten times–that’s because we’ve been footing the bill. When we launched our free SMS service to the world, we set the clock ticking. As the service grew in popularity, so too would the price.

Our challenge during this window of time was to establish relationships with mobile operators around the world such that
our SMS services could become sustainable from a cost perspective. We achieved this goal in Canada, India, and the United States. We can provide full incoming and outgoing SMS service without passing along operator fees in these countries.

We took a risk hoping to bring more nations onboard and more mobile operators around to our way of thinking but we’ve arrived at a point where the responsible thing to do is slow our costs and take a different approach.

No blog do Twitter, os usuários descontentes com a novidade podem encontrar algumas alternativas para receber tweets de seus contatos nos seus celulares.

Variações sobre o tema Twitter

Hoje de manhã li uma notícia sobre o Twitter que gerou várias discussões interessantes com várias pessoas sobre vários temas que considero relevantes. Achei que seria interessante repassar os pontos discutidos aqui.

Tudo começou com uma discussão sobre as causas da instabilidade que vem assombrando o Twitter nos últimos dias. Fenômeno da internet, o microblog parece estar sofrendo dos altos índices de popularidade e tem passado mais tempo fora do ar do que dentro dele (aliás, neste momento em que vos falo, o dito cujo nem responde com a tradicional tela de erro).

Quem acabou levando a culpa foi o também famoso Ruby On Rails, que serve de base para o funcionamento do site. Foi noticiado que eles estariam com problemas de escalabilidade (ah… a escalabilidade… suspiros), e que a equipe de desenvolvimento estaria considerando migrar para PHP ou Java. Obviamente os advogados de Java de plantão se uniram e começaram a malhar o Rails. Afinal, como todos sabemos, “só Jesus salva, e só Java escala.”

Neste momento, cabe um comentário: programo em Java desde 96, adoro a linguagem e inclusive ganho o meu pão de cada dia com ela. Mas esse mito da escalabilidade única de Java me dá calafrios…

E ainda cabe outro comentário: a dúvida entre PHP e Java é pouco lisonjeadora pra esta última….

Voltando: eu não conheço RoR, não conheço Ruby, não sou fã da sintaxe da linguagem, e sinceramente não tenho motivos pra defender ou atacar nenhum dos dois. Mas, como diria meu colega Raphael: linguagem não escala, quem escala é a arquitetura do sistema, e parecia óbvio que havia um problema de arquitetura e infraestrutura por trás.

E não deu outra. No final de maio, o próprio blog do Twitter publicou uma entrevista comentando os problemas que eles vem enfrentando e ficou claro que no caso deles, o buraco é bem mais embaixo:

Q: Is it true that you only have a single master MySQL server running replication to two slaves, and the architecture doesn’t auto-switch to a hot backup when the master goes down?
A: We currently use one database for writes with multiple slaves for read queries. As many know, replication of MySQL is no easy task, so we’ve brought in MySQL experts to help us with that immediately. We’ve also ordered new machines and failover infrastructure to handle emergencies.

Resumindo: o Twitter tem como base 3 computadores!!! Provavelmente eles são adeptos da famosa frase do Knuth que diz que otimização prematura é fonte de problemas. Eu também concordo com isso, mas com ressalvas. Acho que existem otimizações maduras que são necessárias e sempre bem vindas.

Mais pra frente, existe um outro ponto que achei interessante: Segundo o artigo, eles contrataram alguns ex-engenheiros do Google, que irão trabalhar na escalabilidade do sistema, e em particular, irão migrar para um sistema de armazenamento de dados baseado em sistema de arquivo, substituindo o sistema de base de dados.

Você sabia que o Google não usa base de dados para o seu incrível sistema de buscas? Pois é, tudo se baseia no BigTable, uma espécie de mega-arquivo distribuído que entre outras coisas não permite operações de joins, por questões de escalabilidade e velocidade.

E isso suscitou uma outra discussão com um colega de trabalho: hoje em dia, pensou em persistência, pensou em sistema de base de dados. Mesmo que isso não seja realmente necessário.

Sistemas de base de dados são ferramentas extremamente úteis, eficientes e importantes no dia a dia da computação, sobretudo quando falamos de sistemas web. Mas é sempre bom lembrar que as vezes um simples arquivo em disco resolve muito bem. Quando? Quando não precisamos de operações como buscas, joins, filtros, histórico….

Exemplo: no job4dev, o sistema de envios de mensagens para o Twitter é assíncrono. Ou seja, a vaga é adicionada no sistema, e de tempos em tempos uma tarefa cron (sim, o bom e velho crontab do linux que funciona perfeitamente) pega o título e url das vagas e envia para o microblog. Para simplificar minha vida, eu salvo as informações que eu quero enviar em um arquivo (cada vaga é gravada em um arquivo diferente) em um diretório pré-determinado, que a tarefa cron lê. Simples, eficiente. E aposto que 95% das pessoas que fizessem isso pensariam de cara em salvar num BD, só para ter que fazer um select depois.

Outro exemplo de uso de BD que eu achava inútil: durante muito tempo eu trabalhei em uma empresa que desenvolve soluções para análise de dados biológicos. Um dos nossos sistemas era um visualizador de lotes de seqüências genéticas. Obviamente, todos estes dados estavam armazenados em uma linda base de dados normalizada. Para carregar um lote, era necessário sempre fazer uma enorme quantidade de joins e selects. O detalhe é que NUNCA o sistema fazia buscas nestas sequências, NUNCA o sistema filtrava apenas alguns dados do lotes, e SEMPRE o lote era carregado de uma vez e salvo de uma vez, em um sistema Desktop onde o gerenciamento de dados em memória é bem simples. E ainda assim, os meus apelos para usarmos arquivos em disco foram inúteis.

O que eu gostaria de deixar como ponto importante deste post que as vezes é bom pensar fora da caixa, procurar novas abordagens para resolução de problemas, sair um pouco da rede de proteção que algumas ferramentas já bem estabelecidas supostamente oferecem. Estas ferramentas são boas, não tem como negar isso e dizer que elas não servem pra nada. Elas servem, e muito.

Mas o status quo não leva a evoluções. Se você dissesse hoje que iria fazer um sistema de buscas de páginas sem usar BD, provavelmente muitos diriam que você é louco.

Conversando com o Twitter

Eu já divulguei aqui que o Job4Dev tem integração com o sistema de microblog Twitter, através do usuário job4dev, onde são enviadas as ofertas de emprego.

O que eu não divulguei ainda é que desde terça está no ar mais um projeto que contou com a minha participação: sigaseutime.com.br. A idéia é bem simples: utilizar o Twitter para agregar notícias e informações de jogos ao vivo do seu time de futebol favorito. Criamos contas para diversos times do Brasil e do mundo (sigaCorinthians, sigaPalmeiras, liveBarcelona, e por aí vai. Acesse o site para o obter a lista completa).

O que eu não contei também é que fazer integração via software com o Twitter é extremamente simples, graças à API REST de acesso. REST? REpresentational State Transfer, termo criado por Roy Fielding, computeiro americano e um dos principais autores da especificação do protocolo HTTP, em sua tese de PhD.

O próprio REST tem como pilar o protocolo HTTP. A idéia básica é definir que existem recursos (fontes de informação) que podem ser acessados através de um identificador global (que no caso do HTTP, é conhecido como URL), e que retornam uma representação da informação (XML, JSON, etc). Os recursos são considerados objetos, e o REST utiliza as ações do protocolo HTTP para agir sobre estes objetos: GET, POST (as mais famosas, para quem trabalha com sistemas web e com ajax), PUT e DELETE.

  • GET URI corresponde à operação de leitura de um objeto
  • POST URI correponde à operação de criação, atualização ou remoção de um objeto, utilizando dados enviados pelo comando.
  • DELETE URI corresponde à operação de remoção de um objeto.
  • PUT URI corresponde, assim como POST, à operação de atualização ou criação de um objeto.

Assim como no HTTP, o REST não armazena sessão: o acesso tem que ser feito sem que o recurso precise ter conhecimento de requisições passadas, proxys, caches e outros recursos utilizados em sistemas web. Ou seja: qualquer serviço REST pode ser acessado apenas com a URI apropriada e a ação desejada.

A API REST do Twitter permite acesso a todas as funcionalidades do sistema, de forma extremamente simples. Por exemplo: caso eu queira listar as mensagens recebidas pelo usuário job4dev em formato xml, basta acessar a URL http://twitter.com/statuses/friends_timeline/job4dev.xml. O sistema retorna informações também em JSON (neste caso, bastaria mudar o xml do final por json).

A maioria dos comandos requer autenticação, que no caso do Twitter é feita usando o Basic Auth: a informação de usuário e senha é enviada em um header chamado Authorization, cujo conteúdo é uma string na forma Basic <dados em base 64>, onde <dados em base 64> é usuario:senha codificado em base64 (formato muito utilizado para transmissão de dados na web).

Vou colocar aqui um exemplo em Python para enviar uma mensagem nova para uma conta no Twitter. A função encodestring é responsável por converter para base64, e a função urlencode gera uma string no formato correto para colocar na requisição HTTP:

auth = encodestring('%s:%s' % (user, password))[:-1]
header["Authorization"] = 'Basic %s' % self.auth
encoded_post_data = urlencode({"status":status})
req = Request(TwitterSender.url, encoded_post_data, header)
url_data = urlopen(req)

O mais interessante desta API é que além de ser simples, ela é muito bem documentada: http://groups.google.com/group/twitter-development-talk/web/api-documentation

Job4Dev + Twitter

Na sexta feira entrou no ar uma nova funcionalidade do Job4Dev: integração com o Twitter. Para quem não conhece o Twitter, acho que a melhor explicação que eu posso dar é o texto da página inicial do próprio site:

Twitter is a service for friends, family, and co–workers to communicate and stay connected through the exchange of quick, frequent answers to one simple question: What are you doing?

Resumindo tudo: é um microblog. E qual o interesse do Job4Dev por um microblog? Simples: mais formas de divulgação. O Twitter permite o envio de mensagens através de Google Talk, Jabber, Live Journal, RSS e SMS, além do próprio site.

Temos agora um usuário job4dev no twitter, que pode ser acessado através da URL http://twitter.com/job4dev: para onde todos os anúncios de vagas aprovados serão enviados a cada meia-hora, e divulgadas em tempo real para todos os usuários do Twitter que cadastrados na nossa rede de contatos. Simples e eficiente!

PS: Gostaria de aproveitar para dizer que o RSS do Job4Dev no Google Reader anda meio problemático ele não é atualizado desde o início de abril. Estamos tentando corrigir isso o quanto antes.