当有一些节点实例时,如何正确处理 worker_threads 终止? (比如 docker-swarm 或 Kubernetes 集群)

How to properly handle worker_threads termination, when there are some node instances? (Like docker-swarm or Kubernetes cluster)

我正在节点中创建 worker_threads 并将它们收集到自定义 WorkerPool。所有工人都是独一无二的,因为他们拥有独一无二的worker.threadId。我的应用程序能够终止特定的工作人员——我在 WorkerPool 中有 terminateById() 方法。

因此,如果您有一个 node.js 实例 -- 一切正常。但是,如果您尝试使用 docker-swarm 或 Kubernetes——您将拥有 n 个不同的 WorkerPool 实例。因此,例如,您已经在一个节点实例中创建了一些工作人员,现在您正试图终止一个——这意味着您有一些带有 threadId 的请求(或其他用于识别工作人员的唯一数据)。例如,您的负载均衡器已选择为此请求使用另一个节点实例,在这种情况下您没有工作人员。

起初我想,我可以将worker的唯一索引更改为userId+ThreadId之类的东西,然后将其存储在redis中。但是后来我还没有找到任何关于 Worker.findByThreadID() 之类的信息。那么当你有多个节点实例时,我该怎么办?

更新: 我发现了一些关于负载均衡器中粘性会话的信息。这意味着,使用 cookie 我们可以将特定用户粘附到特定节点实例,但在我的情况下,这种粘性必须处于活动状态,直到 worker 终止。可以持续几天

所以,我有两个答案。

  1. 您可以在负载均衡器中使用 粘性会话,以便将特定的用户请求路由到特定的 node.js 实例。
  2. 您可以在 redis 或任何数据库等中存储工作人员状态 + node.js 实例 ID。当您收到 stopWorker 请求时——您正在从 redis 获取有关工作人员已初始化的节点实例的信息.然后你使用任何消息代理来通知所有节点实例,消息由 nodeInstanceId 和 workerID 组成,每个实例检查它是否是它自己,如果是,则转到当前 WorkerPool 并通过 id
  3. 终止 worker