ニコニコ動画勉強会に行ってきました

ニコニコ動画(γ)‐トップページ

本日ドワンゴさんの会議室にてこっそり開催されたニコニコ動画勉強会に参加してきました。
日本の動画コメントサービス「ニコニコ動画」の裏側をドワンゴの開発者の方から
直接お話しを聞いて、参加者も一緒に意見交換ができる非常に面白い勉強会でした。
ドワンゴさんとしては会社で行なう技術者向けの勉強会初めての試みということもあり、
まずは開発者の知り合いベースで声をかけあって少人数で開催することにしたそうです。
六本木のクラブの人や、バイナリカンファレンスでご一緒した人とこんなところで
お会いできるとは思っていませんで、さまに想定の範囲外でした。
その甲斐あって密度の濃い話ができたと思います。

以下、自分用のメモを公開できる範囲で書きます。間違っていたらすみません。(ご指摘いただければすぐに訂正します)

■ニコニコ動画の苦労話 (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しか通らないユーザでも楽しめるようにせよ」

ニコニコ動画の構成要素

  1. Flash Player (XMLSocketで通信)
  2. メッセージサーバを自作 (C++)
  3. Webアプリケーションサーバ (PHP)
  4. 動画サーバ (ニコニコ動画の外)

データ設計

video (DB)
動画情報
thread (DB)
動画ごとに複数待たせられるように
コメント (CSV)
ファイルの追記で

メッセージングサーバの通信方式

  1. XMLSocket
  2. 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 在宅勤務

■参加者リンク集

(随時更新します)

コメントは受け付けていません。