Disqus のスケール - Django で月間80億PVを処理する

私が把握してる限り Django で一番大きなサービス Disqus のスケール (執筆時点ではサービスダウンしてる)。元ネタは Scaling Django to 8 Billion Page Views です。月間80億PV45k req/s のほぼすべてのトラフィックを Django で処理しているとのこと。抄訳になるかな。

WAF は高速開発とパフォーマンス新しい人が入ってすぐに開発に参加できることとカスタマイズ等のトレードオフがあります。この記事ではそのトレードオフである高速開発とパフォーマンスをどう両立させるか、Disqus のノウハウが紹介されています。

>>> なぜ WAF (Web Application Framework) は遅いのか

最初に思い浮かぶのは、アプリケーションに必要ではないボイラープレート (django.contrib とか?) や不要なコードがあるため。そもそも Django の思想が Python 同様 "バッテリー同梱 (batteries included)" のため、Django は他の Python 製 WAF よりボイラープレートが多いです。Disqus 曰く "実は言語や WAF は遅さにあまり関係ない" それより "ネットワーク内の他のサービスとの通信" のオーバーヘッドが原因とのこと。これは一般的によく言われてることですし、大規模になればなるほどそう。Disqus の場合は PostgreSQL, redis, Cassandra , Memcached 等のサービスが使われているそうです。DB へのスロークエリーやネットワークのレイテンシーは Django のようなボイラープレートによるオーバーヘッドを軽く上回ります。この待ち時間を回避する一番メジャーな方法はキャッシュの使用です。Django では キャッシュフレームワーク を使用します。Django でキャッシュを使うのは簡単ですし、バックエンドに Memcached を使うと充分高速化できます。

はい。ここまでは一般的な話です。こっから。

>>> 45k req/seq を処理する

キャッシュしたところで、html テンプレートや json のレンダリング、等、Django ミドルウェアの処理など毎秒 45000 回も不要な処理が発生します。45k req/seq のうち同じレスポンスがあるならいちいち処理させるのはもったいない。結果が同じものはレスポンス全体をキャッシュし、他のすべての処理をスキップします。

Varnish の使用

Varnish は LB (HAProxy) と Django バックエンドの間に HTTP ゲートウェイキャッシュとして導入。同じレスポンスを処理する際は Django サーバではなく Varnish が返す。以前はブラックボックス的に Varnish を使ってたけど、色々と試した結果 Django サーバへのリクエストは 45k req/seq のうち 15k req/seq (64% 削れたらしい) になったとのこと (そんなにあるんだ・・・てか結局 15k req/seq はさばくんですね)。

で Django と Varnish について Django Con US 2013Varnish User Group で発表されたようです (タイトル 'Varnish によるスケール' に変更したい)。

要約すると・・・

  • 適宜 304 Not Modified を返す。クライアントにはキャッシュしてるやつを使ってもらう。Firebug とか Page Speed とかで確認できます (参考)。Django 側では django.views.decorators.http.last_modified デコレータ (本家ドキュメントでは django.views.decorators.http.condition を使うか、django.views.decorators.http.etag との併用が推奨されてます) を使って Last-Modified ヘッダーを返せます
  • django.views.decorators.cache.cache_control で同様の機能が提供されているが、HTTP パースや WSGI、ミドルウェアの処理等が実行されてしまう。
  • TTL は 5秒ぐらい (短く) 設定する
  • Varnish 初期状態では Cookie ヘッダーをキャッシュしない。sessionid 毎にキャッシュするよう変更する。
  • URL 設計とか大事
  • Varnish OOM 頻発するしクラッシュ多かった。。。4-6 時間に一度 Varnish をリスタートしている。それと SSD 使おう! (え・・・
  • DDoS 対策としても使える

よし。Varnish 勉強しましょう!(Django えっ...

コメント

このブログの人気の投稿

Python から Win32 API 経由で印刷する

財務諸表 (Financial Statements)

Django と Python 3 - #python_adv