0

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

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

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

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

4

1 回答 1

0

所以,我有两个答案。

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