Erlang: WhatsAppを支える技術(その2)

http://www.youtube.com/watch?feature=player_embedded&v=EyJtULAEoKM

1 comment | 0 points | by Jshiike 約4年前


Jshiike 約4年前 | ▲upvoteする | link

[Slide] http://www.erlang-factory.com/upload/presentations/752/reed-efsf2013-whatsapp.pdf


その1はこちら


今回、WhatsAppのRuck Reedは、マルチメディア機能(画像、ビデオ、音声ファイル)をErlangでリプレースした経験を語っています。



MMSを利用して、画像、ビデオ、音声ファイルを送信できる。


1) チャレンジ


送信者の携帯以外で記録されたデータも多い


グループ間送信ができる


複数のプラットフォーム対応: トランスコーディング要


データ取得して転送、アーカイブしていなかった


ユーザ増、ユーザ当たりの利用量増、利用に占めるマルチメディア比率増


2) レガシーシステム


スケーラビリティ不足


トランスコーディングがクライアントまかせ


スケーラビリティに有効だとわかってきたErlangで書かれてなかった


3) 目標


スケーラビリティの実現


信頼性


ユーザの利用感の向上


4)レガシーMMSアーキテクチャ


Lighttpd + PHP


デュアルへキサコア


DNSラウンドロビン


参照カウントないので、時間基準でのメディアデータ期限設定


クライアント主導のトランスコーディング


5) 新MMSアーキテクチャ


ネットワーク環境が悪くてもリトライするアップロード/ダウンロード機能


参照カウント


転送するデータは再度アップロード不要にする


サーバ側でコントロールするトランスコーディング


ローエンド端末に対応するためにサーバ側で画像一部切り取る機能


DB (オブジェクト、リファレンス、トランスコーディング) はmnesiaを採用


Erlangメッセージングクラスタをメインクラスタに導入。既にアップロードされたファイルであればURLを返し、二重アップロードを防ぐことができるようになった。アップロードのロードバランスと参照管理機能も。


HTTPアップロード/ダウンロード: 扱いやすいが、SSLネゴシエーション、端末ごとの違いで遅延はでる。


ウェブサーバ Yaws: 基本的なファイルサーバ機能に加えて、適宜必要なアプリモジュールを組み込みやすい。


オブジェクトストレージ: 利用比率がアップしている画像ファイルを動作の早いストレージに、ビデオと音声ファイルは遅いストレージを用意


メディア種類判別機能: erl_img, MediaInfo, ffprobe


トランスコーディング: ffmpeg


シェルをバイパスするためos:cmdのクローン


プロキシリクエストの調整: 早いストレージが用意される画像ファイルでもグループ間で頻繁に利用されるなどして滞留する場合はアーカイブされる。そしてリバースプロキシでホスト名を調べる。


メンテのプロセス: データを永遠には保持できないので時間ベースのファイル期限管理をしたり、参照が切れているオブジェクトを見つけたり、遅いストレージへ移行したりする。


ハードウェアスペック: デュアルオクトコア、256GB RAM、6 x 800GB SSD、2x デュアル リンクアグリゲーション ギガビットイーサネット


6) 残課題の対処


SSL: Erlangで書かれたSSLのコネクションスループットはマシンのRSAレートよりもかなり低かった。Webサーバの外でSSLを切り、YAWSがHaプロキシ型のヘッダを受け入れるようにパッチした。


YAWSのsendfileを無効に。ホストのメモリ帯域を確保 


Mnesiaテーブルを最適化したパックフォーマット変更しストレージサイズ45%改善


参照チェックのロジック改善しスピードアップ


100万エントリを超えるとバックグラウンドプロセス mnesia:selectが相当時間がかかる。継続selectで改善。


DBマイグレーション: レイジーマイグレーションで段階的に。トランザクションはしてないが、単一IDが単一プロセスに。シリアライズされ、参照一致をあまり気にせずに済む。


帯域が逼迫: ビデオのフレームレートや音声ファイルのサンプルレートなどあらゆるメディアパラメータにキャップをつけて管理。大量にダウンロードされるメディアの画質を落とす対応。


まだ尾を引く問題: ストレージの冗長性担保、DBホストのメモリリーク調査中、ロード中のmnesiaスキーマ管理大変、プレイバックしてしまう問題のためにトランスコーディングを調整、トランスコードCPUの管理、キャパシティ計画


7) 結果


ピーク時: 214,000,000 イメージ / 日


8,800 イメージ/秒ダウンロード


29Gb/秒アウトプット帯域


Erlangは大量のbyteをプッシュするのは得意だが、SSLの件などからもわかるように、何でもできるわけではない。トランスコードのように頻度高く調整が必要なコーディングには活きる。




ワザノバ TOP100 アクセスランキング [8/25-10/12]



#erlang #whatsapp

Back