0

タイトルを許してください、私が探しているものをどのように表現するか、または探しているものを知っているかどうかさえよくわかりません.

潜在的に大量のリクエストを同時に処理するサービスを実行しています。さらに、サービス内で、並行して実行している外部サービスに対して一定量 (通常は 10 ~ 15) の要求を行う必要があります。このコードは次のようになります。

        Task<IResponse>[] tasks = new Task<IResponse>[Adapters.Count];
        for(int i = 0; i < Adapters.Count;i++)
        {
            IAdapter adapter = Adapters[i];

            Func<IResponse> makeExternalHttpRequest= () => adapter.MakeExternalHttpRequest(element, mappings);
            tasks[i] = Task.Factory.StartNew<IResponse>(() =>
                {
                    try
                    {
                        var result = makeExternalHttpRequest();
                        if (!token.IsCancellationRequested)
                        {
                            return result;
                        }
                    }catch(Exception exception)
                    {

                    }

                    return null;

                }, token);
        };
        var timeout = ...some timeout value
        Task.WaitAll(tasks,timeout, token);
        tokenSource.Cancel();

        for (int i = 0; i < tasks.Length; i++)
        {
            if (tasks[i].Result != null)
            {
                if (tasks[i].IsCompleted)
                {
                    results.Add(tasks[i].Result);
                }
            }
        }

過去 6 ~ 7 か月間、すべてが期待どおりに機能しているように見えましたが、昨日、サーバーがダウンし、システム管理者から次のようなメッセージが送信されました。

ここに画像の説明を入力

強調表示された領域に気付くと、経過時間に対してかなり大きいです。

これが原因でサーバーがダウンしたのではないかと推測していますが、まだ原因を調査中です。

何が起こっているのか、次のステップはどうあるべきかについて何か考えはありますか?

4

1 に答える 1

0

次のステップは、より多くの情報を収集することだと思います。コードが書かれている方法では、リクエストはタイムアウトの期限が切れた後 (またはすべてのタスクが完了したときのいずれか早い方) にすぐに返されます。他のタスクは、バックグラウンドで独自に実行され、makeExternalHttpRequest()最終的にメソッドがタイムアウトすると仮定すると、すべて独自の時間でスピンダウンします。

コードがその上の行でブロックされるため、キャンセルトークンは何も役に立ちません。

私がすることは、どの外部リクエストが最も長くかかっているかを把握し、それが発生したときに警告をログに記録することです。そうすれば、少なくとも、何が起こっているかについてより良い情報を得ることができます。この疑似コードを参照してください。

(上のどこかで、ロガーとSystem.Diagnostics.Stopwatch

              try
                {
                    var result = makeExternalHttpRequest();
                    if(stopwatch.Elapsed > SomeUnreasonableTimespan) 
                          logger.Warn("Task exceeded reasonable execution period." + TaskData);

                    if (!token.IsCancellationRequested)
                    {
                        return result;
                    }
                }catch(Exception exception)
                {

                }

                return null;

一般的なコメントとして、次の情報が最も役立つと思います。

過去 6 ~ 7 か月間、すべてが期待どおりに機能しているように見えましたが、昨日、サーバーがダウンし、システム管理者から次のようなメッセージが送信されました。

これは、問題がおそらくコードに関連しているのではなく、別の何かに関連していることを意味します。トラブルシューティングを行うとき、私は変更されていないものを無視し、変更されているものに注目する傾向があります。サーバーは時々クラッシュします。あなたが心配する必要があるのは、ほとんどの場合、それらがあなたの要件を満たしているかということです? もしそうなら、私はこのコードについてあまり心配しません。

于 2013-03-21T00:00:05.883 に答える