@yokomaya3 (史郎 横山)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

アクセスが殺到による待ち時間低減案

解決したいこと

PHPを書ける方にお願いしたいことが有ります。
私はアイデアを思いついただけで実現方法が全く分かりません。

具体的には私が掛かってる病院の予約システムのサーバーが弱いのか
回線が弱いのか予約開始から三分ほどクリックしてもグルグル回るだけで
重くて重くて仕方ありません。
多分アクセスが殺到してDDOS攻撃状態になっているんじゃないかと
思いますが、この解決案を思いつきました。

最初にキューが溜まっていると判断したら処理後(すぐにキューがある時)、
その次からクリックした端末に1から10秒のランダムな強制待ち時間を返して、
次のクリックまでの時間をあと何秒お待ちくださいとタイマー表示するのです。

その事によってユーザーはタイマーが動いている間は押せないと
諦めがつくし、むしろ何秒後には押せるという安心を得られます。

サーバーは当然クリックが実質減るのですから、無駄に応答する必要がなく
待ち時間は結局減らせると思うのです。

既出でしたら大変申し訳ありません。
そうでなければご自由に開発ください。
私は何の権利も主張いたしません。

0 likes

5Answer

普通に整理券を配るシステムにすればいいんじゃ
予約が早い者勝ちだからアタックされるわけで
でもそんな貧弱なハードや回線だと整理券配る段階で固まりそう

0Like

Comments

  1. @yokomaya3

    Questioner

    ありがとうございます。

ボトルネックが何であるかを考える必要がありますね。少し実現は難しいというか根本的な対策にはなりにくいです。

仮にDBのロックの問題であり、この方法を実現するなら、DBのロックが発生していることの判定(=キューが溜まっていると判断)をPHP側で実施する必要があります。

DBのロック待ちだけであれば単純ですが、芋づる式にDBコネクションの枯渇やWebサーバーのプロセスの枯渇を引き起こしている可能性もあります。後者になってくるとPHPで処理を1次受けすることも難しくなってきますよね。

実際に考えるのであればWebサーバーまで到達させずに待ち行列を作る(amateさんがおっしゃる整理券を配る、仮想待合室方式)ほうが現実的だと考えます。

フロントエンドだけで予約集中タイミングのみ、ランダムで(実際のサーバーの状態を見ずに)ボタンの押せる、押せないを制御して交通整理させる手段も取れなくはないですが、機械的に叩くスクリプトを実行されたら意味ないですし、そういった機械的なバイパスのせいで余計に負荷が増えるおそれもあります。

0Like

Comments

  1. @yokomaya3

    Questioner

    ありがとうございます。

いえ、その手法ではむしろ無駄な処理や通信が発生するので遅延はさらに酷いことになるでしょう。
ランダムな強制的な待ち時間を発生させるなら、PHPでサーバサイドにさせるのではなくJavaScriptを使ってクライアント側でリンクやボタンを押せなくする方がまだマシですね。

0Like

個人的な意見ですが

次のクリックまでの時間をあと何秒お待ちくださいとタイマー表示するのです。
その事によってユーザーはタイマーが動いている間は押せないと
諦めがつくし、むしろ何秒後には押せるという安心を得られます。

予約ボタン押せなかったらユーザーは諦めますか? 怒って諦めるかもしれませんね。
何秒後には押せると分かったら安心ですか? 予約が取れたわけでもないのに何が安心んなのでしょうか?

ユーザーにとっては、予約が取れることが安心です。
逆に何回も「お待ちください」が出現すると、さっき「*秒って言ってたのにまたかよ」
となりクレームになるおそれがあります。

サーバーは当然クリックが実質減るのですから、無駄に応答する必要がなく
待ち時間は結局減らせると思うのです。

それでどれぐらい早くなるのでしょう3分が数秒になりますか?
下手すれば、タイマー表示のために一人当たりの処理が多くなって遅くなる可能性すらあります。

私は、病院に「予約システムがとても遅いのですが早くなりませんか」と要望を出すのが一番いいアイデアだと思います。

0Like

Your answer might help someone💌