YPAC20121日目まとめ
休暇をいただいて参加してきました初YAPC!2日目は体調不良で行けなかったのですが、1日目だけまとめます!
ミスありましたらご指摘いただければ幸いです。では参ります!
Pixivサムネイル
規模
- 33億PV/month
- 6Gbps
画像
- イラスト3千万件
- 各々12〜100件のサムネイルができる仕様
- 総容量30TB
サムネイル生成の仕組み
- 静的なサムネイル生成と動的なサムネイル生成がある
- 静的
- 画像を登録した後、ロックを発行。ユーザを画像情報登録画面に遷移させる
- ユーザが画像情報を入力している間に、裏でサムネイルを生成する
- サムネイル生成が完了するとロックを解除する
- 画像情報登録画面 から 登録完了画面に行くにはロックの解除を待つ
- 半非同期。最終的な完了状態に遷移するためにはサムネイルの生成を待つ必要があるが、待っている間に画像情報を入力させる。実質ユーザを待たせない
- ストレージは自社製のWebDAVクライアント
- キューの管理はQ4M
- 画像処理にはImageMagick
- 処理速度が他ソフトに比べて遅いのは確かだが、画質劣化が小さい。OpenMP無効化、libjpeg turboを使って最適化を行っている
静的サムネイル生成の課題と動的生成
- 課題
- 新しいサムネイルのサイズを使う際には、全ての画像に対するサムネイルを生成しなおす必要がある
- 動的
- Disk容量を消費しない
- アプリの変更に強い
- mod_small_lightをnginx向けに改造したモジュールを使っている
- 高速化のために、サムネイル化した画像をキャッシュサーバに保持するようにしている
NHN:データクリーニング
- 生データを解析に使えるようにするためのプロセス
データの問題
データクリーニングの方法
- 機械と人による確認の両方が必要
1. データの観察
- 最初に観察!
- データが大量の場合、最初にサンプリングを試みる
- ソート
- 制約(ありえない制約を指定して、正しくないデータを探す)
- 正規表現
2. 機械的処理の試み
3. 人で処理する際のガイドラインの作成
4. プロセスの見なおし
- ポイント
- 扱うデータにぴったりあうライブラリはない
- よって、処理しなければならない内容を記録しておく
- 半角→全角
- 前後のスペースの削除
- etc.
- 正しいガイドラインを作るには
- 日本語の定義を学び直す
- 紹介していた本は、「日本語練習帳」か「日本語の教室」だったと思う。。。
クリーニングにおいて重視すること
- 精度。精度がでない速い方法を使うことは無意味
- テストを書く
リアルタイム通知システムの実装
通知システムの構成
- 初期構成
- アプリサーバ以外に、通知専用のサーバがある
- ユーザは通知専用のサーバに接続する。通知サーバはユーザのIDとコネクションのセットを持つ
- アプリサーバからユーザXXXに通知してほしいと依頼を受けると、ユーザIDから該当するコネクションを探し、メッセージを流す
- 初期構成の課題
- 通知サーバを1台しか持てない
- 複数台の通知サーバを持つと、どのサーバに目的のユーザが接続しているか分からず、アプリサーバから全ての通知サーバに依頼を投げる必要がある
- 対応(第2版構成)
- アプリサーバがユーザの接続先情報を持つ。ユーザは一度アプリサーバにアクセスし、指摘された接続先に接続する
- 第2版構成の課題
- Failoverができない
- 対応(第3版構成)
- DB管理
- 第3版構成の課題
- 通知サーバによって負荷が異なる。つまり、アクティブなユーザが集まっているサーバに負荷が集中する
理想的な構成の検討
- クラスタ構成。アプリサーバからは巨大な通知システムに依頼すればいい。ユーザも巨大な通知システムに接続すればいい。巨大な通知システムの実態は複数のサーバで構築されている
- 「関心の分離」の実現
- アプリサーバは「誰」に「何」を通知するかのみ管理する
- 通知サーバは「誰」に通知するには、「どこに」通知すればいいかのみ管理する
- RabbitMQのPub、Subモデルで実現する
- アプリサーバは、SubscriberIDと通知メッセージを通知サーバに投げる
平均レスポンス50msをPerlで捌く中規模サービス(Freakout!)
- Web+DB vol.70と併せて読むといい
概要
高速化の工夫
運用の工夫
- ダウンしたサーバは一度サービスから外す。ウォームアップ処理を施す必要があるため
- 推測より計測
- システム指標、ビジネス指標をとる
- nginxのログに、upstream_res_time、restimeを書きだす
- システム指標、ビジネス指標をとる
- ビジネス指標に基づいて判断を行う
- ex. 障害の判断:サーバが1系統ダウンしてようと、配信に影響がなければ焦る必要はない