【質問#221】ネット予約を成功させる方法

質問・悩み相談の回答です。

質問

いつも楽しく見ています。

今年のGWは久しぶりに制限のないGWとなり、各地混雑したというニュースが目に付きます。

今年のGWに際し、とある人気施設の予約を試み、電波時計を睨みながら、受付開始と同時に操作を開始したのですが、全くつながらず、つながった時には、予約枠は全て埋まっていて撃沈。

まあ今回に限らず、サイトにつながらない。つながったときにはもう予約枠一杯というのは今まで何度も経験しているのですが、いつも疑問に思っていて、質問したいことは、

1.アクセスが集中するサイトに繋がる人、繋がらない人は、どうやって決まるのか?
2.アクセスが集中するサイトで予約を完了させるコツはあるのか?
3.入力事項が数ページに渡る場合(住所入力→別なページに移動→予約日時入力→別なページに移動→人数入力…など)、移動中にタイムアウトになった場合はページを更新するのと、はじめからやり直しを試みるのとどちらが良いのか?
4.サイトの反応がしばらくない場合(タイムアウトの表示されないものの、いつまでたっても画面が変わらない)、ページを更新したほうがいいのか、待ち続けるほうがいいのか?

よろしくおねがいします。

回答

これねぇ、困ってる人結構多いですよね。私も同様の悩みがあります。結論から言いますと、残念ながらネット予約を成功させる確実な方法は無いと思います。

1.アクセスが集中するサイトに繋がる人、繋がらない人は、どうやって決まるのか?

サーバーの内部実装に依存するのですが、多くは先着順(混んでいるときはミリ秒単位になると思われる)になっていると思われます。ただ、最初にページの遷移がある場合だとやや複雑になります。

なにか操作が発生する都度、サーバーの待ち行列にならび、順次処理されていくという感じをイメージしていただければわかりやすいかなと思います。ページ遷移が複数合った場合は、そのつど列に並び直すことになり、その列はサーバーで一つです。ページで別れていたりはしません。

…というのが最もよく見られる動作だと思いますが、正確にはサーバ内部の実装に依存するのではっきりとはわかりません。

2.アクセスが集中するサイトで予約を完了させるコツはあるのか?

残念ながら無いと思います。実質的にはクジのようなものになっていると思います。

人気の施設では質問者様がやっておられるように皆さん予約開始時刻を待ってアクセス、ということをしているでしょうし、ページ遷移を含めると予約が取れるかどうかはほぼクジと言っていいでしょう。

できることがあるとするならば、事前に練習しておくとか、あまりにも低速なスマホ・モバイル回線で行うよりはPC・固定回線でやったほうが安定するとか、その程度のことになると思われます(気休め程度の効果しか無いかもしれないです)。

3.入力事項が数ページに渡る場合(住所入力→別なページに移動→予約日時入力→別なページに移動→人数入力…など)、移動中にタイムアウトになった場合はページを更新するのと、はじめからやり直しを試みるのとどちらが良いのか?

これも残念ながら実装によりけりで、一概にこうとは言いにくいです。

新しくて技術的にイケてるサイトはタイムアウトになってページ更新した場合であってもちゃんとそれまでに入力したデータを保持してくれているのでページ更新したほうがよいでしょう。一方で古い作りのサイトに多いですが、ページ更新すると不正な状態になってしまうものもあり、その場合は最初からやり直したほうが良いです。

どちらが良いのかはその予約サイトごとに混雑している時間で実際に試して検証するしかないですが、労力の割にあまり有用な情報は獲られないようにも思います。

4.サイトの反応がしばらくない場合(タイムアウトの表示されないものの、いつまでたっても画面が変わらない)、ページを更新したほうがいいのか、待ち続けるほうがいいのか?

これはおそらく、待ち続けたほうが良いケースが多いと思われます。

技術的な話になりますが、HTTPコネクションのタイムアウトというのは複数が存在します。

一つはTCP Connectのタイムアウトです。これは比較的短いことが多く、ブラウザによって数十秒程度のタイムアウト時間が設定されています。もう一つ、HTTPセッションのアイドルタイムアウトというものもあり、これは数分〜数十分の長い値が設定されていることが多いように思います。

やや不正確な表現をしますと、前者が「ノックをしてから『どうぞ』と言われるまで待てる時間」で、後者が「部屋に入ってから行列で待てる時間」みたいな感じに考えていただければわかりやすいかもしれません。

ブラウザでタイムアウトであるという表示がなされるのは、前者のケースが圧倒的だと思われます。TCP Connectが失敗するケースというのは相当な負荷がサーバーにかかっているケースであって、ここが接続できないならば早々に諦めよう、というポリシーで短いタイムアウト時間が設定されているのだと思われます。

そういうわけで、「タイムアウトと表示されるわけではないが画面が表示されない」というのは、TCPセッションは確立されており、サーバー内で処理待ちの状態であるというケースであることが多いと考えられます。

このような状態でリロードしてしまうとまた処理待ちの列に並び直すことになりますから、タイムアウトになったとブラウザが諦めない限りは待っている方が良いと思われます。

ただ、しつこいですがあくまでも「そういう傾向がある」としか言えません。先着順で処理しないようなサーバプログラムが動作していた場合にはリロードしても待っていても同程度の時間で処理されるかもしれません。また、内部で何らかのリトライ処理が走っており、そのリトライ間隔が試行ごとに伸びていくという類のものであった場合はリロードしたほうが速いケースも考えられます。

というわけで、これも中々言い切ることは難しいのですが、私は待ち続けたほうが良いケースが多いとは思います。

以上、全部まとめますと、

  • 固定回線で高性能な端末から予約する
  • 予約フォームの入力手順を調べておいて入力の練習をしておく
  • ページ表示が遅い場合はなるべく待ってみる

というのが簡単にできる対策かなと思います(ただし大きな効果は期待できない)。

その他の方法としては、私がたまにやるのはキャンセル待ちですね。たとえシステムとしてキャンセル待ちというものが実装されていなくとも、オンライン予約システムのほとんどは予約状況がリアルタイムで表示されるようになっているのでキャンセルが出た際もすぐに表示が更新されます。

キャンセルポリシーで定められた請求なしでのキャンセルが可能な期限が近いものはよくキャンセルが発生するので、定期的に見ておいてキャンセルが出たときにすぐ予約すると取りやすかったりします。ということは結果的に直近の土日祝日などが多く取れることになりますので長期的な計画が立てにくいのがデメリットですが、まあそれを受け入れれば取りやすくはなるかなと。

あとは単純に繁忙期を避けるというのもありますね。

もちろん、そういった工夫ができるのであれば皆さんするでしょうし、出来ないから「どうやったら確実に予約が取れるだろうか」とお悩みになるのだというのは理解していますが…。

以降ではさらに高度な内容を説明しますが、基本的にはおすすめしません。

Katalon Recorder (Selenium tests generator)というChrome拡張機能があります。

これはプログラマがテストを目的として事前に決められた手順に従ってブラウザを自動で操作するためのツールで、Excelのマクロ記録のようにブラウザ上のユーザー操作を記録して再現する機能が備わっています。これで事前に予約フォームを入力する手順を作成しておいて実行すれば、人が手で入力するところはスキップできるので入力を高速化でき、かつ再試行も容易にします。プログラマ向けのツールなので使い方は難解だと思います。

こういったツールを用いて複数のアカウントを取得し、10台とか20台のレンタルサーバから一斉にアクセスをすれば「くじ」の引く回数が増えるので予約は高確率で取れるようになります…が、これは専門的な知識が必要になる上、犯罪になる可能性があります。刑法233条の偽計業務妨害罪、234条の電子計算機損壊等業務妨害罪です。大量の端末から一気にリクエストを送ってサーバー負荷を増大させサーバーの正常な業務処理を妨害しているからアカン、ということですね。たまにTwitterでこういったことをやったと自慢し、その後犯罪だと指摘されてツイ消しする人を見かけます。

前述したKatalon Recorderも人間が手で入力した場合よりも圧倒的に高速でリクエストを送信するので上記のような刑法に抵触する可能性はゼロではないですが、サーバ上で消費されるトータルの計算資源量は手で入力しようが自動化しようが同じなので、1台で実施している限りは大丈夫ではないかと思います。(何かあっても私は責任は取りませんが…)

もし、このあたりを詳しく知りたい場合は「岡崎市立中央図書館事件」なども見てみてください。警察もIT関係には疎いのかプログラマや専門家からすると「そんなもんで逮捕勾留すんの!?」と思える事件が多く、正しいソフトウェア開発行為まで萎縮させてしまうと度々問題になります。余談ですが。