質問: webで重い処理をするとリクエストが10回飛ぶ phpでフレームワークのcakeを使ってwebシステムを作っているのですが、どうしてもわからない点があるので、ご教授頂きたく質問させていただきました。 現在webサーバ2台とdbサーバ1台であるサービスを運営しています。 webサーバはロードバランサで負荷分散をしています。 画面上でどうしても重たい処理をする必要があり、実行しているのですが、リクエストが10回飛びデータが10個登録されるという不思議な現象が起こっており対応に困っています。 開発用にwebとdbが一緒の開発用サーバもあります。やったことは 1.開発用のサーバで同じデータ、同じ処理を実行 リクエストは1回でデータも1個登録 apacheのアクセルログにも1回アクセスされている 2.運営用のサーバで同じ処理だが、データ量を減らして実行 リクエストは1回でデータも1個登録 apacheのアクセルログにも1回アクセスされている 3.運営用のサーバで同じデータ、同じ処理をipアドレスを指定して実行 リクエストは1回でデータも1個登録 apacheのアクセルログにも1回アクセスされている 4.運営用のサーバで同じデータ、同じ処理を実行 リクエストは10回でデータも10個登録 apacheのアクセルログにも10回アクセスされている 以上の結果からロードバランサで何かしらのことがされているのかと思い、サーバ会社に問い合わせてみたのですが、「そんなことはない」との回答でした。 他に何をどう調べたらいいのかもわからず、かなり手詰まりなかんじです。 手がかり、確認内容などなんでもいいので、ご教授頂けないでしょうか。 よろしくお願いします。
回答: とりあえず、クライアント側の通信内容を見てみてはどうでしょう。 リクエストは以下の順で流れます。 ブラウザなどクライアント → ロードバランサ → apache → php クライアントが 1回リクエストを送って、apacheに 10回くるなら、 ロードバランサが悪さをしてる可能性が高いです。 クライアントが pcのブラウザなら、 firefox の livehttpheaders という addon で簡単な通信内容がみれます。 他にはwiresharkなどのパケット監視ツールも使えます。 もしブラウザが 10回リクエストを送っているなら、 ロードバランサはたぶん関係ありません。 その場合はブラウザのレスポンスも見ます。 リクエスト1 → レスポンス1 → リクエスト2 → レスポンス2→... のようにレスポンス取得完了後に、次のリクエストを送っているなら、 サーバー側が再通信させるレスポンスを返しているのではないでしょうか。 リクエスト1 → リクエスト2 → レスポンス1 → レスポンス2→... のようにレスポンスが完了する前に次のリクエストを送っていれば、 サーバー側は関係なく、クライアント側が連続リクエストしていることになるので、 javascriptやブラウザの問題だと思います。 参考になるか分かりませんが、私が以前経験した似たようなケースで、 登録データが多すぎる → 通信に時間がかかりすぎてタイムアウト → クライアントの機能で通信自動リトライ 結果、何度もリクエストしてデータが重複登録される、ということがありました。