Amazon, Yahoo, Twitter, RSS, REST, JSON など Web サービスを活用してプログラムをする機会が増えています。
とても便利な Web サービスですが、開発者が注意しておきたい点があります。
注意: TCP ソケット リソースには限りがあります。
一台のコンピュータで利用できる TCP ソケットは、限りあるものです。
さらに、TCP ソケットが利用するメモリなどのリソースは、ファイルやプロセスのハンドルと同じ領域を利用します。
このため、多くのプロセスが動作するコンピュータ上で、一度に使える TCP ソケットは限定されており、使い切ってしまうと、TCP 接続ができなくなる上に、さまざまなエラーが発生する可能性があります。
また、TCP ソケットは、CLOSE 処理後も、一定時間 TIME_WAIT ステータスとして保持されます。
たとえば、Amazon API を使って、100冊の書籍情報を取り出すループ処理を行った場合、一時的に 100 個の TCP ソケットが消費されます。CLOSE してから、次の処理をしているから、瞬間的には 1 個 の消費とはなりません。
また、10 冊の書籍情報を表示する Web ページが 100 ページある Web サイトの場合、Google や Bing などの検索エンジンのクローラにより、すべてのページにアクセスが発生すると、10 * 100 = 1000 個の TCP ソケットを一時的に消費します。短時間に 1万ページ以上をアクセスするクローラーもあります。
Web サービスだけでなく、SMTP, POP3, IMAP4, FTP, WebDAV も同様に限りある TCP ソケットを消費します。
なお、SQL Server は、限りあるリソースを有効に利用するため、コネクションプール技術を提供しています。
コネクションプールにより、大量のデータベースアクセスを、クライアント・サーバーともに安定して処理します。
便利な Web サービスを有効に活用するには、開発者が TCP リソースの制限を理解し、適切に管理していくよう注意しておきたいと思います。
TIPS:
- コマンド netstat -ano -p tcp により、TCP 接続状況を確認する
- レジストリにより TIME_WAIT を維持する時間を調整する
- 接続処理を TIME_WAIT にあわせて一定の間隔をあける
- Web サービスの値をキャッシュし、大量の Web サービス接続が発生しないように調整する
- 最大 TCP 接続数が、一定以上にならないようにプログラムを調整する