■ ニコニコ動画勉強会に行ってきました
本日ドワンゴさんの会議室にてこっそり開催されたニコニコ動画勉強会に参加してきました。
日本の動画コメントサービス「ニコニコ動画」の裏側をドワンゴの開発者の方から
直接お話しを聞いて、参加者も一緒に意見交換ができる非常に面白い勉強会でした。
ドワンゴさんとしては会社で行なう技術者向けの勉強会初めての試みということもあり、
まずは開発者の知り合いベースで声をかけあって少人数で開催することにしたそうです。
六本木のクラブの人や、バイナリカンファレンスでご一緒した人とこんなところで
お会いできるとは思っていませんで、さまに想定の範囲外でした。
その甲斐あって密度の濃い話ができたと思います。
以下、自分用のメモを公開できる範囲で書きます。間違っていたらすみません。(ご指摘いただければすぐに訂正します)
■ニコニコ動画の苦労話 (Sさん)
ニコニコ動画の歴史
- 2006年10月
- 一人でプロトタイプを開発開始、サーバ/クライアントともに3営業日で完成 (これはすごい)
- 2006年12月
2007年12月(年間違えてました。アヨハタさんより指摘を受けて訂正) - ニコニコ動画(仮)の試験サービス開始
- 2007年1月15日
- ニコニコ動画(β)として正式アナウンス
- 2007年1月31日
- はやくも月間1億PVを突破
- 2007年2月7日
- 投稿コメント数1000万件突破
- 2007年2月20日
- ニコニコ動画へのDDoS攻撃が断続的に行われる
- 2007年2月23日
- YouTubeからアクセス遮断
- 2007年2月24日
- ニコニコ動画(β)サービス終了、新サービスへの移行準備を告知
- 2007年3月
- ニコニコ動画(γ)サービス再開、自前動画投稿サイトSMILEVIDEOも開始
- 2007年4月
- 登録ユーザー限定のクローズドサービスながらも順調にアクセスを伸ばす
- 開発者
- 最初はKさん一人だったが現在は開発者7人(うち2ちゃんねるでの人材募集2人)
→YouTubeからのアクセス遮断の危機を乗り越えながらも急激に成長してきたニコニコ動画の裏側に迫る...
ニコニコ動画のサーバ構成
- Webサーバ
- LAMP構成 ( Linux 2.6 / Apache 2 / MySQL 5 / PHP5 )
- メッセージサーバ
- C++で独自に実装 (以前ネトゲ用に作ったサーバを改造)
- ハードウェア
- hp DL360 × 十数台 ~ (負荷にあわせて増強)
負荷分散
- 現在のトラフィック約430Mbps
- Webサーバ:50Mbps×7台、メッセージサーバ:15Mbps×6台
- Webサーバの Apache は prefork
- プロセス数は2000に設定、メモリは4GBに増設
MPMがworkerじゃないのはPHP5がスレッドセーフじゃないので - PHPキャッシュはAPCを使って高速化
- 昔はeAcceleratorを使ってたけど、optimizerのバグで一部のPEARモジュール(pear/Services_YouTube)が誤動作したためAPC(Alternative PHP Cache)に乗り換えた
- データキャッシュ(動画リストなど)
- pear/Cache_Lite → memcached に変更、3分おきにバッチで更新
- Apacheのアクセスログ6GB/日を突破
- awstats(限界) → Google Analytics(いまここ) → Urchin (検討中)
- メッセージサーバの負荷分散
- DB参照/更新クエリを最大9秒バッファリング
- MySQLクラスタ構成
- マスター1台、スレーブ6台
- 未来検索ブラジルの Senna 使ってるよ
- MySQL の FULLTEXT INDEX をハンドリング
- 複数テーブルにまたがるJOINは避ける
- 非正規化ロジックで対応
- 更新の多いテーブルは基本的にInnoDBを
- ログ系や更新頻度の少ないテーブルはMyISAMに
- コメントはCSVデータで保存
- 1000行以上のCSVデータはインデックス化
■ニコニコ動画の仕組み (開発者Kさん)
開発ポリシー
- 会長からの指令
- 「プロトタイプ開発の締め切りは設けない」「ありえない早さで開発して欲しいから」
- このサービスは絶対ウケル
- 「スケーラビリティを考慮せよ」「HTTPしか通らないユーザでも楽しめるようにせよ」
ニコニコ動画の構成要素
- Flash Player (XMLSocketで通信)
- メッセージサーバを自作 (C++)
- Webアプリケーションサーバ (PHP)
- 動画サーバ (ニコニコ動画の外)
データ設計
- video (DB)
- 動画情報
- thread (DB)
- 動画ごとに複数待たせられるように
- コメント (CSV)
- ファイルの追記で
メッセージングサーバの通信方式
- XMLSocket
- HTTP
- a. 双方向 chunked content-transfer-encoding
- b. 下りのみ chunked
- c. polling
a.b.のchunkedのサーバ実装を二週間かけてせっかく作ったのに、Flash Player側がclosedを検出しないとコールバックが呼ばれないことに後から気付いて没に...orz
画面レイアウト
- XGAを想定
- 512 x 384 で収まるように設計
- とにかくコメントが気軽に投稿できること
- 最初の段階ではコメントの量を増やすことが重要
- コメントの細密充填 (特許出願中)
- コメントの量が増えたときマーキー/上下固定・弾幕など(意外と細かい)
その他
Excelの定義ファイルから通信部分コードジェネレーションなどなど
(中略)
■結論
バイナリアンここでも発見。ニコニコ動画開発者のKさんはネ申。
感想
勉強会の後の懇親会では、SWFの逆コンパイラの話が普通にでてきて、ActionScriptのバイトコードの最適化の話ができたのが嬉しかったです。
あと、勉強会プレゼン中に参加者がケータイでリアルタイムにツッコミができるニコニコプレゼンのアイデアは面白かったです。今度どこかのカンファレンスでやってみたいです。
あと、現在開発中のニコニコ動画モバイルの試作版を触らせてもらいましたが、携帯アプリながらもよく作りこまれていました。コメント投稿もすぐ反映されるインターフェースで、これならお金払ってでも使いたい人いるかもしれないと思いました。
ニコニコ動画のアカウントを持っていない私ではありましたが、このような貴重な勉強会に誘っていただき本当にありがとうございました。>関係者の皆様
キーワード
Scraping YouTube AmebaVision フォト蔵 Flash Flex C++ PHP MySQL WebAPI CS UTF-8 UI Wii Rimo 在宅勤務
■参加者リンク集
- void GraphicWizardsLair( void ); // 「ニコニコ動画勉強会」に行ってきた
- IT戦記 - ニコニコ動画の勉強会にいってきた
- coding my life : ニコニコ動画勉強会:お疲れさまでした
(随時更新します)