[筆者: Nicolas Vincent, Alex Khadiwala]
2012年に本誌TechCrunchのデベロッパチーム(Nicolas Vincent, Alex Khadiwala, Eric Mann, John Bloch)が、TechCrunchのデザイン変更に取り組んだとき、主な目標のひとつがパフォーマンスの向上だった。その目標を達成するためにわれわれは、開発の一環としていくつかのツールを作った。
われわれが取ったアプローチの一つは、時間を消費するタスクをバックグラウンドのタスクにしてしまうことだった。WordPress(本誌の基幹エンジン)上でバックグラウンドタスクを構成するためのライブラリとして、WP Async Task(WordPress非同期タスク)というものを作った。
今年の6月に”Non-Blocking WordPress“(ノンブロッキングWordPress)と題するプレゼンテーションを行う機会があり、その中でわれわれは、パフォーマンスに対するわれわれのアプローチについて語った。そのときのオーディエンスは、われわれが実装した非同期タスクに大きな関心を示し、コードを入手して自分たちでも使いたい、と言われた。
そこで、本日(米国時間7/31)をもってわれわれは、WP Async TaskライブラリをオープンソースとしてGitHubから提供することにした。われわれは、オープンソースソフトウェアがもたらすパワーの熱烈な信者であり、われわれにこのパブリシングプラットホーム(WordPress)を提供したコミュニティに、お返しをしたいと思う。コードとドキュメンテーションをご覧頂いて、ご自分のコードにおけるこのライブラリの使い方を、ご理解頂きたい。
なぜタスクを非同期にするのか?
ページのロードがブロックされたり、ロードに長時間かかるのを防ぐためには、CPUを競合するプロセスの数を減らしたい。ページロードの長時間のブロックは、ほかのプロセスが、リソースが空く(自分の順番が回ってくる)ことや、何かの操作が終了することを待っているときに、よく起きる。
TechCrunchのサイトでは、企業や人物のデータベースCrunchBaseのカードを、今読まれている記事ページの上にロードするときに、サイトのスピードが鈍化する。そのときはプロセスがCrunchBaseのAPIを呼び出してカードを作ろうとしているからだ。パフォーマンスを上げるためにそれらのデータを約12時間キャッシュしているが、最初にデータを取り出すときや、キャッシュをリフレッシュするときには、そのためのAPI呼び出しがページロード時間に影響を与えないようにしたい。
そこでCrunchBaseからキャッシュにデータを取り出すときには、APIの呼び出しと実行が終了するのを待つのではなく、その処理を非同期のバックグラウンドタスクとして起動する。すでにキャッシュにデータがあるときには、カードでそれを使う。このようにすると、CrunchBaseのカードの表示がページのロードを邪魔しない。
TechCrunchの以前のデザインでは、ページのロードタイムが1ページにつき17秒以上かかることもあった。新しいデザインでは、WP Async Taskライブラリの実装により全体的なパフォーマンスは5倍から8倍は向上した。それには、バックエンドとフロントエンドの両方に対する、そのほかの改良も、大いに貢献している。
下のビデオは、2014年6月にサンフランシスコで行われたBig Media & Enterprise MeetupでプレゼンをやっているNicolasとAlexだ。10upのデベロッパ、John BlochとEric Mannにも感謝申し上げたい。
[原文へ]
(翻訳:iwatani(a.k.a. hiwa))