「ポーリングって、あのボールでピンを倒すゲームでしょ」って、つまらないボケをいきなり言ってしまいましたが、今回はシステムの「ポーリング」について解説します。
ポーリングは実はシステムにおいて、非常に重要な役割を担っていて、様々は場所で活躍してます。
システム内でのポーリングの役割とメリット、デメリットも理解していきましょう!
ポーリングはシステム内の状態を把握するための仕組み
ポーリングはズバリ「定期的な問合せ」のことです。
英語のpollingは「投票、刈り取る」のような意味があるようですが、「刈り取り」って言葉が近いですかね。
ポーリングは相手がどんな状態になっているか、どんなことを待っているのかを問い合わせることで知る仕組みです。
システムとしての使い方としては大きく二つあります。
ポーリングの使い方
- データの転送を制御するために使う
- 監視をするために使う
最近だと、「相手の状態を確認する」という汎用的な意味合いで使うことが多いかもしれないですね。
動作を理解しよう
では、ポーリングの動作を具体的に解説します。
郵便屋さんがポストを巡回する例がよく使われます。手紙を出す人はポストに手紙を投函しておくだけで、手紙が相手に配達されますよね。この時の郵便屋さんがポストを巡回するのがポーリングです。
郵便屋さんはポストの中に手紙があるか無いかに関わらず、時刻表に従ってポストの中身を確認しにいきます。もしもポストに何も無ければ、そこで終了ですが、ポストに手紙があれば、手紙を郵便局に集めて、配達する流れに繋がっていきます。
図で表すと以下のような感じですね。
このポーリングを使うメリットとしては、以下のようなものがあります。
ポーリングのメリット
- ループするだけなので、プログラミングが容易である
- 相手が応答できるか確認に使える(死活監視)
- まとめて一括処理ができる
この辺のメリットを意識して、具体的な例を次から見てみましょう。
ポーリングの例
ポーリングの例の一つとして、メールの受信があります。
下の図のように、メールBOXには様々な送信者からのメールが届いて溜まっています。受信者のメールソフトは自分のメールBOXに定期的に問合せ(ポーリング)を行い、メールがあれば、メールBOXから自分のPCにメールを取ってくる処理を行います。
このように一連の処理において、前処理(メールBOXの受信)と後続処理(メールソフトの取得)の間に関連付けが必須で無い時にポーリングを使っています。
メールBOXがメールソフトにメールが届き次第PUSHするような仕組みも作れなくは無いですが、非常に複雑な仕組みになるので、ポーリングの方がシンプルで良いですね。
もう一つの例として、サーバの監視があります。
サーバは時間の経過とともに、CPUやメモリ、HDDなどの部品が壊れたり、サーバのサービスや電源が落ちてしまったりなど、様々な事象が発生します。障害発生時に誰も気付かないと大変なことになります。そこで監視サーバがポーリングによって対象のサーバの状態を監視することで、障害発生時に検知することができます。死活監視と呼んだりしますね。
サーバのサービスがダウンしたり、ハングした際に、故障したサーバから自発的にその状態を伝えることはできません。外部から定期的にポーリングで状態を問い合わせる事でサーバの状態を知ることができますね。
また、定期的にサーバのCPUやメモリがどのくらい使われているか、いわゆるリソースを監視して、サーバのヘルスチェックをしたりする際もポーリングが使われます。
ポーリングの特徴と反対の仕組み
まず、ポーリングの特徴としては以下のようなものがあります。
ポーリングの特徴
- 問い合わせは一方的に行う
- 問い合わせは定期的であり、一定間隔で行われる
つまり、ポーリングは時間を空けて、定期的に行うので、即時性には欠けます。
ポーリングの反対として、即時性の処理を行うための仕組みが「割り込み」です。割り込みは「イベントが発生した瞬間」に通知を受けて、後続の処理が行われる仕組みとなります。事前に各イベントに対する処理方法を決めておくことで、処理を即座に実行できます。
ということは、「ポーリングより、早く処理できて良いじゃん!」なりますが、そう上手いだけの話でもありません。割り込みは同時に行っている処理が多ければ多いほど、割り込みが発生時の他の処理の一旦停止が多くなるので、システム全体として非効率になる可能性が出てきます。
一方、ポーリングには他の処理を一旦停止することがない、つまり邪魔をしないため、割り込みの発生が多いと想定される場合は、ポーリングで定期的にイベントをチェックしたほうが効率よく運用できるケースもあります。
要は使い分けが重要、ということですね!
ポーリングの向いている、不向きな処理
ここまでの解説を踏まえて、ポーリングに向いている処理と不向きな処理を整理しましょう。
向いている処理
- 一定の間隔で処理が実行できれば良い処理(即時性がそれほど求められない)
メールの受信確認やステータスの変更確認 - 監視の処理
システムのリソースやサービスなどの監視
不向きな処理
- 状態では無く、入力内容に応じて実行内容を変える処理
キーボードの入力やマウス操作 - 処理の優先順位付けが必要な処理
ポーリングは時間で均等に実施するので処理の優劣が無い
ポーリングに不向きな処理は前述の割り込みを使ったりします。
ここで一つ重要なことですが、ポーリングにおいて、状態をより早く検知したいがために、ポーリング間隔を短くするとシステム内部が高負荷になったり、ネットワークのトラフィック量が増大するので注意が必要です。
ポーリングの間隔は他への影響も考慮して決めましょう!
まとめ
今回はポーリングに関して解説しました。
システムにおけるポーリングはシステム内外の状態の監視やデータの取得など、様々な場面で使われています。
ポーリング処理が止まっていると、気付いた時には大量のエラーが発生していた、なんてこともあるので、ポーリング処理が動いていることをポーリングで監視したりしますね。ややこしい。。。
また、なんでもポーリングではなく、ポーリングと割り込み処理を使い合わせることも重要ですね。
家で子供に「宿題やったの!?」って定期的に確認する、あれもポーリングですね(笑)
以下記事でポーリングに関係する「コンピュータの割り込み処理」や「スクレイピングの仕組み」を解説してみますので、併せて読んでみてください。
以上です!