質問

い数の開発者は最近っている"というだけでポーリングスタッフのデータベースファイル等) かを判定するのに何か変更し、その実行タスクなどのサポートいたします。

私はこの考え方や感じることの利用可能な技術など リモ, WCF, など。するよりも遥かにポーリング.

しかし、そういった特定の理由その他の人の好みの一つのアプローチのその他の、より重要なのは、どのように私を納得させその他のポーリングは間違ったこの時代?

役に立ちましたか?

解決

ポーリングは「間違った」ものではありません。など。

多くは、その実装方法と目的によって異なります。変更を即座に通知することに本当に関心がある場合は、非常に効率的です。コードは緊密なループ内にあり、リソースが変更/更新されたかどうかを常にポーリング(質問)します。これは、何か違うことができるとすぐに通知されることを意味します。しかし、あなたのコードは他に何もしておらず、問題のオブジェクトへの多くの呼び出しに関してオーバーヘッドがあります。

即時通知をあまり気にしない場合は、ポーリング間隔を長くすることができます。これもうまく機能しますが、正しい間隔を選択するのは難しい場合があります。長すぎると重要な変更を見逃す可能性があり、短すぎると最初の方法の問題に戻ってしまいます。

割り込みやメッセージなどの代替手段は、これらの状況でより良い妥協を提供できます。実質的に可能な限りすぐに変更が通知されますが、この遅延はユーザーが制御するものではなく、状態の変化を渡すことについてコンポーネント自体がタイムリーであることに依存します。

「間違った」とはポーリングで?

  • リソースを大量に消費する可能性があります。
  • 制限される場合があります(特に、/ポーリングについて知りたいことがたくさんある場合)。
  • やり過ぎかもしれません。

しかし...

  • 本質的に間違っているわけではありません。
  • 非常に効果的です。
  • 非常に簡単です。

他のヒント

原則として、ポーリングが悪いと見なされる理由は2つあります。

  1. これはリソースの無駄です。変更が発生していない間に変更を確認する可能性が非常に高くなります。このアクションに費やされるCPUサイクル/帯域幅は変更にならないため、他の何かに費やすほうが良かった可能性があります。

  2. ポーリングは一定の間隔で行われます。これは、次回間隔が経過するまで変更が発生したことを知らないことを意味します。

変更が通知された方が良いでしょう。これにより、発生していない変更をポーリングせずに、通知を受信するとすぐに変更を知ることができます。

この日と年齢でポーリングを使用するものの例:

  • 電子メールクライアントは、新しいメッセージをポーリングします(IMAPを使用している場合でも)。
  • RSSリーダーはフィードの変更をポーリングします。
  • 検索エンジンは、インデックスを作成するページの変更をポーリングします。
  • StackOverflowユーザーは、「更新」を押すことで新しい質問をポーリングします;-)
  • Bittorrentクライアントは、Swarmの変更を追跡するためにトラッカー(およびDHTを使用して相互にポーリングする)をポーリングします。
  • マルチコアシステムのスピンロックは、他のコアが待機していることを実行する前に、このコアで別のスレッドをスケジュールする時間がないほど遅延が短い場合、コア間の最も効率的な同期になります。 。

単に非同期通知を取得する方法がない場合があります。たとえば、RSSをプッシュシステムに置き換える場合、サーバーはフィードを読んで、それらに連絡する方法を知っている必要があります。これはメーリングリストです。RSSが避けるように設計されたものの1つです。したがって、私の例のほとんどはネットワークアプリであり、これが問題になる可能性が最も高いという事実です。

他の場合、ポーリングは非同期通知がある場合でも動作するほど安価です。

ローカルファイルの場合、原則として変更の通知の方が適切なオプションです。たとえば、ディスクを永久に突っ込んでいる場合、ディスクがスピンダウンするのを防ぐかもしれませんが、その場合もOSがキャッシュする可能性があります。また、1時間に1回しか変更されないファイルで毎秒ポーリングする場合、マシンの処理能力の0.001%(または何でも)を不必要に占有している可能性があります。これは小さいように思えますが、ポーリングする必要があるファイルが100,000個ある場合はどうなりますか?

ただし、実際には、どちらを実行してもオーバーヘッドは無視できるほど小さいため、現在動作しているコードを変更することに興奮するのは困難です。最良の方法は、変更したいシステムでポーリングが引き起こす特定の問題に注意することです。もしあれば、すべてのポーリングに対して一般的な議論をするのではなく、それらを発生させます。見つからない場合は、壊れていないものを修正することはできません...

ポーリングは簡単で、非常に簡単で、手続き型コードと同じくらい簡単です。ポーリングをしないということは、非同期プログラミングの世界に入ることを意味します。これは頭が痛いほど簡単ではなく、時には挑戦的になることさえあります。

そして、すべてのシステムのすべての場合と同様に、通常、抵抗の少ない道がより一般的に採用されているため、非同期パターンで物事を複雑にする必要がない場合があるため、ポーリングを使用するプログラマー、優れたプログラマーも常に存在します。

私は常にポーリングを避けるために繁栄していますが、特に非同期処理の実際のゲインがそれほど大きくない場合、たとえばいくつかの小さなローカルデータに対してアクションを実行する場合(もちろん、少し速くなります) 、ユーザーはこのようなケースでは違いに気付かないでしょう)。したがって、私見の両方の方法論の余地があります。

クライアントポーリングは、サーバー通知と同様にスケールしません。数千のクライアントがサーバーに「新しいデータを要求します」と想像してください。 5秒ごと。ここで、サーバーがクライアントのリストを保持して新しいデータを通知することを想像してください。サーバー通知のスケーラビリティが向上しました。

ほとんどの場合、イベントまたは割り込み駆動の状況であっても、あるレベルでポーリングが行われていることを理解する必要があると思いますが、ポーリングを行う実際のコードからは隔離されています。本当に、これは最も望ましい状況です...実装から自分を隔離し、イベントに対処するだけです。ポーリングを自分で実装する必要がある場合でも、分離されるようにコードを記述してください。結果は実装とは無関係に処理されます。

シンプル-ポーリングは悪い-効率が悪い、リソースの浪費など>

では、なぜ余分な距離を移動し、追加のポーリングを実施するのか。

コールバックは最適なオプションです-コールバックを現在のプロセスに結びつけることを心配するだけです。根底には、とにかく接続がまだあることを確認するためにポーリングが行われています。

ガールフレンドに電話/呼び出し音を鳴らし続け、彼女が決して答えない場合、なぜ電話をかけ続けるのですか?メッセージを残して、彼女が「コールバック」するまで待ちます;)

特定の状況で時々ポーリングを使用します(たとえば、ゲームでは、キーボードの状態をフレームごとにポーリングします)が、ポーリングのみを行うループではなく、チェックとしてポーリングします(リソースX変更されましたか?はいの場合、何かを実行し、そうでない場合は他の処理を行い、後でもう一度確認してください)。ただし、一般的に言えば、非同期通知を優先してポーリングを避けています。

何かが起こるのを待つためにリソース(CPU時間など)を費やさないという理由(特にそれらのリソースがそもそも起こることをスピードアップできる場合)。ポーリングを使用する場合、アイドル状態で待機することはなく、リソースを他の場所で使用するため、問題ではありません(少なくとも私にとっては)。

の場合はポーリングのために変更されるファイルは、そのことに同意し、そのファイルシステムの通知となるが、ほとんどのosです。

データベースがトリガーに更新を挿入し、呼び出して、外部のコードを何もしないわけにはいかない。しかしすることができるといらっしゃらない要件を瞬時に行動します。のためのインスタンスが必要なデータからのデータベースへのデータベース億異なるネットワーク内の15分間とさせていただきます。データベースBのようなアクセスからのデータベースが、その時点でのポーリングから、ジョブロテーションプログラム近く、データベースB

また、ポーリングは非常に簡単なものです。ですが最初のステップ実行時間の制約、コミュニケーションでも十分では残ります。

ポーリングに関することは、それが機能するということです!信頼性が高く、実装が簡単です。

プーリングのコストは高くなる可能性があります-1日に2つの変更しかない場合に1分ごとにデータベースの変更をスキャンする場合、非常に小さな結果のために多くのリソースを消費します。

ただし、通知技術の問題は、実装がはるかに複雑であり、信頼性が低いだけでなく(これは大きなBUT)、動作していないことを簡単に判断できないことです。

したがって、他の技術のポーリングをドロップする場合は、平均的なプログラマーが使用でき、非常に信頼できることを確認してください。

ここには多くの答えがありますが、最も簡単な答えはそれ自身の答えだと思います:

(通常)コールバックのインフラストラクチャを作成するよりも、ポーリングループをコーディングする方がはるかに簡単だからです。

その後、より単純なコードが得られますが、後でそれがボトルネックになることが判明した場合、簡単に理解し、別の何かに再設計/リファクタリングできます。

これはあなたの質問に答えているわけではありません。しかし現実的には、特にこの「日と年齢」ではプロセッササイクルが安価で、帯域幅が大きい場合、ポーリングは実際にはいくつかのタスクに適したソリューションです。

利点は次のとおりです。

  • 安い
  • 信頼性
  • テスト可能
  • 柔軟

ポーリングを避けることは良い方針であることに同意します。ただし、ロバートの投稿を参照すると、ポーリングのシンプルさ非同期アプローチは、実装に忍び込む可能性のあるバグは言うまでもなく、多くの場合、非同期アプローチは読みにくく保守が難しいため、ここで言及した問題がそれほど大きな問題ではない場合には、より良いアプローチにすることができます。

すべてと同様に、それは依存します。私が現在取り組んでいる大規模な高トランザクションシステムは、SQL(特定のテーブルのトリガーから拡張SPによって呼び出されるSQL Server内にロードされたDLL。その後、実行する作業があることを他のアプリに通知します)による通知を使用します。

ただし、継続的に実行する作業があることを実質的に保証できるため、これから離れています。したがって、複雑さを軽減し、実際に少しスピードアップするために、アプリは作業を処理し、すぐに新しい作業のためにデータベースを再度ポーリングします。何もなければ、少し間隔を空けて再試行します。

これはより速く動作するようで、はるかに簡単です。ただし、アプリケーションの別の部分では、パフォーマンスが低下するポーリング間隔が非常に短い場合を除き、この方法を使用した場合、速度が大幅に低下することはありません。この部分については、そのままにしておきます。したがって、それが適切な場合は良いことですが、みんなのニーズは異なります。

プッシュとプルの相対的なメリットの良い要約です:   https://stpeter.im /index.php/2007/12/14/push-and-pull-in-application-architectures/

これをこの答えにさらに要約したいのですが、いくつかのことは省略せずに残しておくのが最善です。

SQLポーリングについて考えるとき、VB6の時代には、非同期の「リスニング」を早期に実現したWithEventsキーワードを使用してレコードセットを作成できました。

個人的には、ポーリングの前に常にイベント駆動型の実装を使用する方法を探しています。次のいずれかを手動で実装すると役立つ場合があります:

  • SQL Service Broker /依存関係クラス
  • いくつかの種類のキューテクノロジー(RabbitMQなど)
  • UDPブロードキャスト-できる興味深い技術 複数のノードリスナーで構築する。ただし、一部のネットワークでは常に可能とは限りません。

これらのいくつかは、プロジェクトの若干の再設計を必要とするかもしれませんが、企業の世界では、ポーリングサービスよりも行くべきより良いルートかもしれません。

通常、非同期/メッセージングの方が優れているというほとんどの回答に同意します。ロバート・グールドの答えに完全に同意します。しかし、もう1つポイントを追加したいと思います。

1つの追加事項は、投票により1石で2羽の鳥を殺すことができることです。ある特定のユースケースでは、私が関与したプロジェクトがデータベース間のメッセージキューを使用しましたが、アプリケーションサーバーからデータベースの1つにポーリングしました。アプリサーバーからDBへのネットワークがダウンしていることが時々あったため、ポーリングを使用してアプリにネットワークの問題を通知しました。

最後に、拡張性を念頭に置いたユースケースで、最も理にかなっているものを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top