3

C# Web API サーバーと Node Express サーバーがあります。C# サーバーから Node サーバー上のルートに何百ものリクエストを行います。ノード サーバー上のルートは集中的な作業を行い、多くの場合 6 ~ 8 秒間返されません。

これらのリクエストを何百も同時に行うと、Node サーバーが失敗するようです。Node サーバー出力のエラーには、 または のいずれsocket hang upかが含まれますECONNRESET。C#側からのエラーは言う

ターゲット マシンがアクティブに拒否したため、接続できませんでした。

このエラーは、予測できない数のリクエストを処理した後に発生するため、サーバーが過負荷になっているだけだと思います。C# 側でa を使用するThread.Sleep(500)と、より多くのリクエストを処理できるようになり、そこで待機をいじることで多かれ少なかれ成功しますが、スレッドのスリープが正しい答えになることはめったになく、このケースも例外ではないと思います。

ノードサーバーに過度のストレスをかけているだけですか? これは、ロード バランシングまたは何らかの形式のクラスタリングでのみ解決できますか? 別の代替案がある場合、それはどのように見えるでしょうか?

私が探求し始めている 1 つの道は、node-toobusyモジュールです。503 を返した場合、次のコードではどのようなプロセスが必要ですか? Thread.Sleepその後、リクエストを再送信する必要がありますか?

4

1 に答える 1

0

node.js サーバーが過負荷になっているようです。

ノード サーバー上のルートは集中的な作業を行い、多くの場合 6 ~ 8 秒間返されません。

これは悪臭です。ノード プロセスが集中的な計算を行っている場合、その計算が完了するまでイベント ループが停止し、他の要求を処理できなくなります。可能であれば、別の CPU コアで実行されるワーカー プロセスでその計算を行う必要があります。clusterはそれを可能にするノード組み込みモジュールです。

私が探求し始めている 1 つのパスは、node-toobsy モジュールです。503 を返した場合、次のコードではどのようなプロセスが必要ですか? Thread.Sleep してから、リクエストを再送信する必要がありますか?

これは、アプリケーションと予想される負荷によって異なります。その間に物事が十分に冷える可能性が高い場合は、1、2 回更新することをお勧めしますが、API については、おそらく C# でも 503 を返したいだけです。サーバーがビジー状態であることをクライアントに知らせて、クライアントに知らせたほうがよいでしょう。独自の決定を下してから、代わりに更新を続けます。

于 2016-02-02T05:22:25.870 に答える