0

小説ですみません…

複数のファイルで何百万ものエンベロープを復号化する必要がある Nodejs プロジェクトに取り組んでいます。アプリケーションのすべての API は、localhost で実行する必要があります。

メイン API は、ファイルのバッチを復号化するためのクライアント リクエストを処理します。各ファイルには、復号化が必要な数千から数百万のエンベロープが含まれています。各ファイルはジョブと見なされ、これらのジョブはメイン API によってキューに入れられ、各ジョブの新しいプロセスをフォークすることによって同時に実行されます。(一度に 5 つの同時ジョブ/フォークのみを許可します) 各プロセスで、ファイルを通過して復号化するスクリプトが実行されます。

これは比較的迅速に実行されますが、メイン API によってフォークされた各プロセス/スクリプトのコードで復号化を行う代わりに、基本的にリクエスト内のエンベロープを取得して送信する別の API (Decrypt API と呼びます) にこの作業を提供したいと考えています。応答で復号化された結果を返します。

そこで、この API を作成し、「forky」を使用してクラスター化しました。次に、プロセスで復号化を行う代わりに、Decrypt API に対して複数の並列リクエストを作成し、応答が返ってきたら、復号化された結果をファイルに配置します。

最初の問題は、次の封筒を送信する前にリクエストが返されるのを待たずに、各封筒を受け取ったときに正しくリクエストを作成したことでした。基本的に、必要に応じて「並列」リクエストを送信し、各リクエストのコールバックで投票を処理します。これにより、ECONNRESET エラーが発生したため、一度に未処理のリクエストが多すぎると思われます。いくつかのリクエストがドロップされました。したがって、私の解決策は、同時要求が多すぎるのを避けるために、一度に最大 x 個の未処理の要求 (私は 10 を使用) を持つことでした。これは問題ないように見えましたが、MainAPI から 5 つのプロセスをフォークしていたので気付きました。それぞれにこの新しい「未処理の要求」制限コードがありましたが、それらは同時に実行されていたため、一度に要求が多すぎるという問題にまだ遭遇していました。復号化 API。また、2 つの異なるマイクロサービス/API を使用するこの方法は、MainAPI のフォークされたプロセスで復号化を行うよりも遅くなります。Decrypt API では、ノードの 'crypto' ライブラリも使用しており、使用する関数の一部は同期的であるため、トラフィックが多いと問題になると思われますが、これらの同期方法を回避することはできません。

最後に、私の質問は、説明したように高トラフィックで Decrypt API の速度を上げるにはどうすればよいですか? また、これらの要求がドロップされないようにするにはどうすればよいでしょうか?

初心者のように聞こえるかもしれませんが、これらの API はすべて同じマシンとローカルホストで実行されているため、この方法が各プロセスで復号化を行うよりも遅いのはこのためでしょうか?

ありがとう!

4

0 に答える 0