2

ネットワーク対応デバイスへの接続を 15 秒ごとにポーリングする Windows サービスに取り組んでいます。サービスがデバイスに接続できない場合、例外がスローされ、15 秒後に再試行されます。これはすべてうまくいきます。

ただし、デバイスの 1 つが 1 日以上ダウンしているとします。15 秒ごとに同じ例外で例外ログをいっぱいにしています。スローされた例外が過去 x 時間以内に変更されていない場合、例外がイベント ログに書き込まれないようにする標準的な方法はありますか?

4

5 に答える 5

3

必要なものを実現する良い方法の 1 つは、サーキット ブレーカー デザイン パターンを採用することです。

これについては、Pragmatic Press の Michael T. Nygard 著「Release It! Design and Deploy Production Ready Software」(104-107 ページ) で初めて読みました。

サーキット ブレーカーの考え方は、システム間の接続のパスに位置し、接続を通過させ、「ブレーク状態」を監視することです。たとえば、連続して 5 つの接続がすべて失敗した場合にのみトリガーされる場合があります。

サーキットが切断されると、サーキット ブレーカーを介したすべての呼び出しは、外部サービスに問い合わせることなく、すぐに失敗します。これは、ブレーカーが半開状態になるタイムアウトが発生するまで続きます。次の呼び出しが試行されます。失敗するとタイムアウトがリセットされ、成功するとブレーカーが閉じ、システムが操作を再開します。

簡単なグーグルで、ティム・ロスの投稿を見つけました。これは、読みやすく、より詳細になっています。

あなたの場合、タイムアウトが 10 分のサーキット ブレーカーと、5 回の失敗のトリガーを使用できます。ログ ファイルには、1 日中障害が発生した場合、元の問題でログに記録された 5 つの例外が含まれ、その後は 1 時間に 6 つの例外 (15 秒間隔で 240 と比較して) が記録され、問題が持続していることを示します。

要件に応じて、サーキット ブレーカーの手動「リセット」を含めるか、10 分間のタイムアウトで正常に戻ったことが明らかになったときに自動的にリセットするようにそのままにしておくことができます。これは便利かもしれません - 一般に、システム管理者が煩わす必要があるものが少ないほど、システム管理者はそれを気に入ってくれます。

于 2008-10-30T09:16:27.203 に答える
1

ポーリングが一定回数失敗した場合、ポーリング間隔が増加するというワークフローがあるかもしれません。たとえば、15 秒ごとに 3 回程度ポーリングし、失敗した場合はポーリング間隔を 1 分に増やし、n 回失敗した場合は時間を 1 時間に増やします。

正直に言うと、上記のワークフローは実際には問題を解決しません。私があなたなら、ワークフローを逆にします。サーバーがデバイスをポーリングする代わりに、その逆を行ってみませんか? デバイスがネットワーク化されたマシンに接続されると、クライアント側のサービスがサーバーにメッセージを送信して、サーバーがデバイスが接続されていて動作していることを認識できるようにします。

お役に立てれば...

Rウェンディ

于 2008-10-29T22:36:45.483 に答える
1

アプリケーションで例外処理ブロックを使用している場合は、異なる例外処理ポリシーを切り替えることができます。最初に例外情報をイベント ログに書き込むのはポリシーであり、n 回の試行または一定期間後に、イベント ログにログを記録しないポリシーに切り替えることができます。

接続を試行する間隔を長くすると、問題が解決する可能性があります。例 newTimeout = n*atomicTimeout ここで、n は試行回数です。

于 2008-10-29T22:56:07.177 に答える
0

どうでしょう...

 int count = 0;
 while (true)
 {
      try
      {
           AttemptStuff()
      }
      catch (Exception ex)
      {
           if(count < 10)
           {
                EventLog.WriteEntry("my service", ex.ToString(), EventLogEntryType.Error);
                count++;
           }
      }
 }
于 2008-12-12T13:22:43.833 に答える
0

サーキット ブレーカーのパターンは良いアイデアだと思います

PHP実装のいくつかの設計をチェックしてください。ただし、どの言語にも適用できます

http://artur.ejsmont.org/blog/PHP-Circuit-Breaker-initial-Zend-Framework-proposal

于 2010-07-17T10:45:12.053 に答える