フリーランチなど無い - There ain't no such thing as a free lunch

コメントシステムにNode.js+Backtweetsを採用

最近いろいろと試行錯誤を繰り返しているTwitterでのコメントシステムだが、結局Topsyは取りやめた。コメントの一部がうまく反映されないことがあるからだ。

代わりに採用したのがbacktweetsだ。Topsyなどと同様に自分のサイトにリンクしているコンテンツをピックアップしてくれるBacktypeというサービスがある。Disqusにも採用されている便利検索サービスなのだが、そのBacktypeのAPIをラップしてtwitterからのリンクだけを抽出してくれるサービスがbacktweetsである。制限等はBacktypeと同じというかうまくゲートウェイだけ作って、検索等はBacktypeに乗っかっている。なのでAPIも基本的にはBacktypeへのproxyとなっている。

ここで問題なのはbacktypeのAPIにJSONPが含まれていないことである。先日書いたようにJSONではブラウザのXSS対策にひっかかって他サイトのデータを取って来ることが出来ない。そこでproxyサーバを立てて自分のサーバから直接backtweetsのAPIを叩くようにした。サーバに使ったのは最近いじっていて面白いと思っているNode.jsというjavascriptの処理系だ。こいつはイベントループでIOブロックしない並列処理をガリガリかけるのが特徴なようだが今回はただのサーバとして使っている。とはいえ、たかがProxyのためにいくつもプロセスを立ち上げたくはないので、その点スケーラビリティの高いNode.jsは便利である。処理速度もGoogleのV8エンジンがベースになっているので素晴らしく早い。とはいえアプリケーションサーバ内でHTTPアクセスを繰り返しているのでページの読み込みは遅くなってしまう。

対処法として

Sinatraのキャッシュを使って初回のみbacktweetsのAPIを叩くようにする Ajaxで遅延読み込みを行う の二つを考えたが、backtweets(というかBacktype)のAPIが1日千回という制限があるのでキャッシュでアクセス回数を押さえられる1のアプローチを取った。ページがキャッシュされてないときだけSinatra側でNode.jsのproxyにアクセスしてデータを取ってくる。これなら読み込みの遅さも随分軽減出来てなかなか快適にTwitterによるコメントシステムを実装出来た。

ただ、これを実装してから気付いたのだがSinatra側で読み込むのであればNode.jsのproxyはそもそも必要ない。とはいえNode.jsの(特にイベントの)勉強になったのと、せっかく作ったのにRubyで作り直すのも勿体ないのでしばらくはこのままで運用しようと思っている。