データベースサーバの接続まわり(接続資源がなくなったとか接続数の上限に達したとか、いろいろ)、もしくはセッション管理(WebクライアントとWebサーバとのセッション管理)の仕組み、にも問題があったのでは?と予想しています。(もちろん私のプログラムに問題はありましたが。)

理由は、負荷について考えたことで書いたように、TosCodeでの検索の場合データベースサーバの負荷は限定的であり、相手側の応答が来るまで次のリクエストを投げないようになっていたので連続してリクエストを繰り返したとしても負荷が増えていくと思えないからです。

私は独立してから、Webアプリケーション開発ではLAMPかLAPPしかやったことがありませんし、小規模なものしかやったことがありません。.netやIISやOracleに詳しい技術者の方のご感想やご意見をお聞かせいただければと思います。

判断材料:こちら側の動き

  • 毎回、リクエストについてレスポンス(正常かエラーを問わず)を待ってから次のリクエストを送信していた(タイムアウトした場合は処理を終了していました)
  • レスポンスがエラーだった場合、リトライするような仕組みは作っていませんでした(データは単にスキップして次のリクエストを送信していました)
  • 複数同時にリクエストを送信するようなことはしていませんでした
  • 単位時間のリクエスト数に制限を設けるため、前回のリクエストを送信した時刻と今回のリクエストを送信する時刻の時間間隔を調整していました(前回のレスポンスを受信した時刻と今回のリクエストを送信する時刻の差を調整したわけではありません)。結果的にこれが短すぎたみたいです、ごめんなさい。

判断材料:Webサーバの動き

  • 約90%ぐらいのリクエストについては正常にレスポンスを送信していました
  • あるリクエストを境に、Webサーバがデータベースサーバとのセッションを確保できず、HTTP 500(内部サーバエラー)を送信していました(次項目の動きから判断して、特定のリクエストが原因ではありません)
  • すべてのリクエストに対して正常にレスポンスを送信できている日もありました

今回の件との関係は不明ですが、私が検索して調べたところ次のような問題もあるようです。
「ASP」「.net」=「自分には関係ない」と思ってしまい知識が乏しいので、これらはまったく見当外れかもしれません。

2010.06.24