非同期プログラミングの
概要 とTwisted Frameworkの最も表面的な話として
、 HighLoad ++(2009) に関するレポートの資料
を公開しています。
最近、Webの分野では、要求処理に数百ミリ秒、さらには数秒かかる「重い」アプリケーションサーバーから、最小の遅延で少量のデータを送信するより軽量なサービスに注目が移っています。 JSONにパックされ、数百バイト単位で測定されたデータの変更を転送するリクエストに応じて、数十キロバイトのHTMLコードを生成することからの移行。 このようなサービスの例には、Gmail、FriendFeed、Twitter Live Searchなどが含まれます。
ユーザーの遅延を最小限に抑えるには、一定の接続(たとえば、Adobe Flash、RTMP)を維持するか、HTTPロングポーリング手法をキープアライブと組み合わせて使用する必要があります。 何らかの方法で、サーバー側では、これにより大量の同時接続が発生します(数千、数万)。 この状況は
C10k問題と呼ばれます。
接続を処理する場合、サーバー側のアーキテクチャの選択はそれほど大きくありません。接続プロセス、接続スレッド、プロセススレッドバリアントの組み合わせ、または非同期I / O(追加のプロセスまたはスレッドと組み合わせて)。 リソースの消費に関して1万を超える同時接続がある場合、1万のプロセスの作成を想像することは完全に不可能です。 1万個のスレッドが妥当な解決策になることはほとんどありません。 このような多数の接続が存在する場合、各接続の作業量は比較的少なく、それらのほとんどは新しいデータの到着を待機していることをさらに考慮する必要があります。 したがって、ほとんどのプロセスまたはスレッドは単に保留され、システムリソースを浪費します。
非同期I / Oにより、単一の実行スレッド(単一プロセス)内の数千のオープンソケットにまたがる非ブロッキングネットワークI / Oが可能になります。 異なるオペレーティングシステムの実装メカニズムは異なります。たとえば、select()、poll()、epoll()、kqueue()などです。 非同期I / Oを使用するアプリケーションの例:
- nginx(追加のプロセスは、大量のCPUを必要とするタスクを処理するために使用されます);
- haproxy;
- memcached
- その他。
ただし、非同期I / Oは普遍的なソリューションではありません。データベースサーバーの場合、各リクエストには大量のディスクI / OとCPU時間が必要であり、これを許可しないため、接続サービスを編成するのに適した方法はほとんどありません1つのプロセスのフレームワーク。
Twisted Frameworkは、非同期ネットワークアプリケーションを実装するための広範なクラスとモジュールのセットです。 Twisted Frameworkは次のとおりです。
- すべての非同期I / O操作を抽象化し、特定のOSの適切なメカニズムを使用するカーネル。
- 遅延コンセプト。リクエストサービスを簡単な形式で実装できます。非同期ネットワーク呼び出し(たとえば、データベース、memcachedへ)、エラー処理。 Deferredは、非同期プログラミングモデルの従来のシリアルプログラミング構造の類似物です。
- HTTP、DNS、SMTP、IMAP、memcached、Jabber、ICQなど、すでに実装されているネットワークプロトコルの広範なセット。 追加のモジュールとして、さらに多くのプロトコルが利用可能です。
- 追加のインフラストラクチャ:遅延サポート、スレッドプール、プロセスなどを使用した単体テスト。
- 高品質の開発コンセプト-完全な単体テストの範囲、変更の厳密なレビュー。
レポートでは、具体的な例として、Twistedに実装された3つのアプリケーションがあります。 この問題を解決するために、Twistedのアーキテクチャ、特定のパフォーマンスパラメーター、最適化手法、長所と短所を考慮します。
追加情報:
プレゼンテーション