タイムアウト

タイムアウト

2021年6月13日





タイムアウト

ネットワークのアクセスの課題

ネットワーク経由のデータアクセスの場合、データにアクセスできない要因が幾つもあります。 良くあるのは、ネットワークの障害、アクセス先のサーバー(コンピュータ)が稼働していない、アクセス先の間違いなどの要因です。さらに、細かくいうと、アクセスのやり方(API やプロトコル)の食い違いなども要因になります。

これに対して、同じコンピュータのドライブ(HDD や SSD)へのデータアクセスの場合は、アクセスするファイルのパスや名前を間違えない場合以外は、通常は問題なくアクセスできるのが普通です。エラーの場合でも、ファイルが存在しないなどのエラーは事前にチェックもできますし、エラーもすぐにわかる場合がほとんどです。

ネットワークのアクセスは時間がかかる

ネットワークのアクセスと言ってもいろいろあります。 同じオフィス(建物)と、別の建物では違いますし、インターネットを利用すれば海外のサーバーにも簡単にアクセスができます。

インターネットを経由して、例えば海外のサーバーにアクセスする場合、いろいろな経路を辿ってアクセスします。従って、同じ建物や同じ家の中のコンピュータにアクセスするよりはかなり多くの時間がかかる場合もあります。また、いろいろなネットワークを経由するので、相手がきちんと動いているのか(稼働中か)や、途中の経路(いろいろなネットワーク)が正常に動いているのかは、殆どの場合事前にはわかりません。また、直前までアクセスができていても、突然アクセスができなくなる事も頻繁に起こります。

つまり、「やってみるまでわからない」というのがネットワーク経由のアクセスの特徴です。

やってみないとわからない!?

やってみないとわからないという意味を、もう少し詳しく考えると、考えられる結果は幾つか考えられます。

  • 普通にアクセスできる(正常アクセス)
  • アクセスの応答がエラーになる
  • 応答がない

が通常考えられるアクセスの結果です。

普通にアクセスできる場合は、通常は問題ありませんが、通常にアクセスできた場合でも、時間がかかりすぎると問題が起こる場合があります。詳しい話はこのあと書きますので、まずここでは、普通にアクセスできる場合は、プログラムを書く場合想定内の出来事と考える事ができます。

アクセスの応答がエラーになる場合は、幾つかあって、インターネットのアクセスは幾つかの中継ポイントを通ってアクセスする場合が殆どですが、その中継ポイントが「何か変」というのを見つけてエラーにする場合と、目的のサーバー(コンピュータや端末)まで辿り着いたけれど、アクセスの仕組みが合わないからエラーにする場合があります。

この2つのケースは少なくても、応答が返ってくるので、処理がしやすいのですが、問題は3つ目の応答がないケースです。

応答がない時はどうする?

応答がない場合は、実際は処理が面倒な場合が多くなります。プログラム自体は、正常か異常かの応答を期待して応答を待っているわけですが、応答がないので処理ができません。この状態は、プログラムがハング(固まる)してしまう一つのケースです。

プログラムがハングするのは余り好ましいことではありません。

従って、その対策として「タイムアウト」という処理をします。 簡単にいうと、「どれくらい待つかを決める」処理です。 決めた時間内に応答がない場合は、エラーとして「待つのをやめる」処理をします。これを「タイムアウト」と呼んでいます。こうすることで、プログラムが永遠にデータを待ち続けるのを防ぐことができます。

ところがこのタイムアウトの処理で難しいのは、「どれ位待つか」の設定が意外に難しいことです。例えば、応答に時間がかかっていて、応答までに 30 秒かかるとします。しかし、タイムアウトの設定時間が 20 秒の場合、実際は、正常のアクセスできた場合でも、20 秒で「データはこなかった」とみなして、待つのをやめてしまう場合があるからです。

わかりやすく例え話を挙げると、午後 7 時に待ち合わせをしていて、待っている人が午後 7 時 30 分になってもこないので諦めて待ち合わせ場所を離れたとします。しかし、待っていた人は何かの事情で到着が午後 7 時 40 分になってしまった場合です。あと 10 分ほど待っていれば、無事に会えたわけですが、30 分で諦めてしまったために会う事ができなかったという場合です。

結局会えない(データを受け取れない)ので、これもエラーなのですが、設定時間をもう少し長くすると上手くいった可能性があるわけです。

ネットワークのアクセスのプログラムを書く上で難しいのは、このタイムアウトにする時間をどれくらいにするかで、エラーの頻度は変わってきます。実際のデータのアクセス時間のデータがある場合は、ある程度設定は簡単ですが、余りデータがない場合は、仮の設定をして時間を調整する必要があります。

まとめ

ネットワークのアクセスを設計する場合、どれ位の時間で届くかを見極めることが重要です。データを永遠に待ち続けるとプログラムがハングしてしまう事があるので、これを防ぐために利用するのがタイムアウトという仕組みで、待つ時間を決めて、それ以上応答に時間がかかる場合はエラーにする手法です。

実際に、ネットワークに直接アクセスするプログラムを書く機会は少ないのが現状で余りこのことを気にする機会は少ないのが普通です。これは、多くのネットワークアクセスは、既存の公開されているモジュールを取り込んで利用するのが普通になっているからです。

これらのモジュールは標準的なアクセスの時間を元にタイムアウトの時間を決めている場合が殆どですが、アクセスする先や処理内容によっては、標準の設定では短い場合もありえます。多くのモジュールは、後からタイムアウトの時間を調整できる場合が多く、実際のアクセスに応じてこの待ち時間を調整する必要があります。

モジュールを使えば余り意識しないエリアですが、タイムアウトのエラーが頻繁に発生する場合は、こうした待ち時間の設定値を調整することが重要です。


Copyright(c) 2017-2021 by Silicon Valley Super Ware, all rights reserved.

コメント

このブログの人気の投稿

ユーザーインターフェースの設計

足し算以外もできるようにする

改良版足し算プログラム