[その1] Netflix: APIの改善と継続的デリバリー

http://techblog.netflix.com/2012/07/embracing-differences-inside-netflix.html

1 comment | 0 points | by WazanovaNews 4年弱前


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

北米のインターネットトラフィックの30%以上を占めるNetflixのシステム構成は、UI(デスクトップ、スマホ、タブレット、ゲームコンソール、TV、ブルーレイ再生機)とサービス(Video meta data, search, user, A/B test, personalization)をAPIでつなぐアーキテクチャーになっていて、UIとサービスがそれぞれ独立して早いスピードで改善 & 新機能を投入できるかたちになっています。そのAPI改善から継続的デリバリーの仕組みをつくりあげるまでの昨年からの一連の動きを、4回にわけて紹介します。まず最初はAPIの改善の取組みから。


1) 背景

Web APIとしてはRESTが標準的になっているが、不特定多数に提供するという前提なので、API提供者側がルールをつくり、API利用者側がそれに従うというかたちになる。Netflixでは800種のデバイスに対応していて、そのAPIは1日20億件のリクエストを受けている。どの会社もNetflixの規模のスケールはしないかもしれないが、対応デバイスの増加という点では共通するので、パブリックAPIとは別に社内向けのプライベートAPIももっと重要になっていくのではないか。

多機種デバイスに対応する社内向けAPIは、一つの規格に全てが従うというパブリックAPIの考え方では対応しきれなくなる。メモリ容量、フォーマット、スクリーンサイズ、通信方式などが各々異なるどのデバイスにとっても、最適化がされてないという事態になる。REST APIを採用してきたNetflixでは、UIチームがその回避策として個別対応を繰り返し、スパゲッティコードをつくってしまうケースもでてきた。そこで方針を転換し、APIを利用するUI開発チーム側がルールを個別に設定できるようにする、つまりAPI開発のプラットフォームを用意することにした。

2) デバイスの違いをうまく取込む

新しいAPIプラットフォームは、UIチームがエンドポイントをカスタマイズして設定できるようにすることで、リクエスト/レスポンスの最適化はUIチームがもつようになる。このために、全体アーキテクチャーの変更が必要になる。

3) コンテンツをまとめることと、それをフォーマット/配信することを分ける

従来のNetflixのREST APIは、コンテンツをソースから集めてまとめて配信するという典型的な仕組みであった。[イメージ図]

新しいAPIでは、まず、一つのデバイス(例えばPS3)がカスタマイズしたエンドポイントにリクエストを投げる。次に、ハンドラーがリクエストを解釈してJava APIを呼び出し、そして、そのJava APIがコンテンツをソースから集めてきて、フォーマット/配信エンジンに手渡す。それぞれのエンジンは特定のデバイスに対応している。[イメージ図]

4) クライアントとサーバの境界を定義し直す。

一般的な「クライアント側のコード」というと、デバイス/UIに存在する全てのコードを指し、「サーバ側のコード」というと、サーバに入ってる全てのコードで、その間はネットワークの境界で区切ることができる。[イメージ図]

Netflixの新しいアプローチは、このクライアントとサーバの境界をサーバ側にずらしていく。つまりクライアントのコードの一部がサーバ側に存在するようになる。具体的には、まず、デバイスにあるクライアントコードがエンドポイントの先にあるサーバ側のクライアントアダプタにネットワークコールをする。次に、Groovyで書かれたアダプタから、一連のサーバ側の呼び出しをして、コンテンツをリソースから集められる。その過程で、Java APIは、コンテンツを集めて、アダプタに渡す役割を担う。アダプタは、不必要なフィールドを整理したり、エラーハンドリング/リトライ/レスポンスのフォーマットを設定したりして、ヘッダーとボディを配信する。このプロセスは、特定のデバイスごとにカスタマイズされている。[イメージ図]

この方式だと、デバイスとサーバ間の頻繁なやりとりがネットワーク経由からサーバ内に移せるので、パフォーマンスが改善される。

5) 配信のイノベーション

UIチームは、APIチームの助けのもと、アダプターのコードのカスタマイズを自ら手がける。Java APIで対応できるという要件さえ満たせば、UIチームはデバイスのコードを書いてユーザエクスペリエンスを向上させることと、そのユーザエクスペリエンスの前提となるアダプタからのコンテンツ配信の両方をコントロールできるようになる。それぞれのアダプタは分離独立しているので、気兼ねなく自由にカスタマイズできる。

もちろんこのためには、UIチームはHTML5 / CSS3 / JavaScriptだけでなく、サーバ側のコードも学ばなくてはいけない。また、彼らのコードが無限ループをつくってサーバを落としたりする事故が起きる可能性をさげるための別のエンジンも用意した。

その2はこちら

http://blog.programmableweb.com/2012/05/15/why-rest-keeps-me-up-at-night/




[Oct. 2013] ワザノバTop25アクセスランキング



#netflix #api #開発スタイル #アーキテクチャ #モジュール化

Back