0

ノードで worker_threads を作成しており、それらをカスタム WorkerPool に収集しています。すべてのワーカーは固有の worker.threadId を持っているため、固有です。私のアプリには特定のワーカーを終了する機能があります - WorkerPool に terminateById() メソッドがあります。

したがって、node.js インスタンスが 1 つあれば、すべて問題ありません。しかし、docker-swarm または Kubernetes を使用しようとしている場合、n 個の異なる WorkerPool インスタンスが存在することになります。したがって、たとえば、1 つのノード インスタンスでいくつかのワーカーを作成し、現在 1 つを終了しようとしています。これは、threadId (またはワーカーを識別するための他の一意のデータ) を使用したリクエストがあることを意味します。たとえば、ロード バランサーがこのリクエストに別のノード インスタンスを使用することを選択した場合、このインスタンスにはワーカーがありません。

最初は、ワーカーの一意のインデックスを userId+ThreadId のようなものに変更して、たとえば redis に保存できると思いました。しかし、Worker.findByThreadID() のような情報は見つかりませんでした。複数のノードインスタンスがある場合、状況で何ができますか?

更新: ロード バランサーのスティッキー セッションに関する情報を見つけました。つまり、Cookie を使用して特定のユーザーを特定のノード インスタンスに貼り付けることができますが、私の場合、ワーカーが終了するまでこの貼り付けをアクティブにする必要があります。それは何日も続くことができます

4

1 に答える 1

0

だから、私は2つの答えがあります。

  1. 特定のユーザー リクエストを特定の node.js インスタンスにルーティングするために、ロード バランサーでスティッキー セッションを使用できます。
  2. ワーカーのステータス + node.js インスタンス ID を redis または任意の db などに保存できます。stopWorker リクエストを取得している場合、ワーカーが初期化されたノード インスタンスに関する情報を redis から取得しています。次に、任意のメッセージ ブローカーを使用してすべてのノード インスタンスに通知します。メッセージは nodeInstanceId と workerID で構成され、すべてのインスタンスがそれ自体であるかどうかを確認し、そうである場合は、現在の WorkerPool に移動して ID でワーカーを終了します。
于 2021-11-10T16:44:11.003 に答える