gpt4 book ai didi

多核或单核上的多个 Node 实例上的 Node.js 集群模块

转载 作者:太空宇宙 更新时间:2023-11-04 02:22:39 25 4
gpt4 key购买 nike

我正在构建一个运行 .12.7 的 Node.js 后端。该后端每秒将处理数千个 HTTP POST,并且每个 POST 都需要首先进行身份验证。

实现每个 POST 身份验证的最快方法是在第一次尝试对用户进行身份验证后生成一个 session key ,并且所有后续尝试都将使用存储在内存数组中的此 session key 进行身份验证。 session key 将在 10 分钟后过期。

由于数组查找是同步的(需要 5 到 40 毫秒),我需要增加处理连接的实例或工作线程的数量。

我正在考虑的两个选择是:

  1. 在单个核心计算机上运行 Node 的多个实例并将负载平衡设置为粘性,以便每次客户端发送 POST 时都会转到同一服务器。这是为了确保我能够根据内存中存储的 session key 对客户端进行身份验证。
  2. 使用集群模块在多核机器上启动工作线程。这样做的优点是它可能更容易维护,因为我不需要运行多个单个实例。

当我在 nodejs.org 上查找 Cluster 时,它显示“稳定性:2 - 不稳定”。我正在读这篇文章,因为它还没有准备好生产。但看博客似乎每个人都推荐使用 Cluster。

有人在生产环境中实现过集群吗?我还应该考虑其他替代方案吗?

提前致谢

最佳答案

您可能会考虑使用 HMAC,就像 Amazon 对 S3 所做的那样,等等。这使您能够验证请求是否已获得授权,但无需保留 session 进行验证。

基本上,您获取所有请求数据并将其与只有授权方和服务器知道的 key 一起进行散列。然后,您获取此哈希值并将其与您的请求一起发送。服务器获取此数据,重新散列,如果存在匹配,则允许该请求。例如,这是原始请求:

POST /something
X-Key: thekey

现在我们将所有这些与 secret 一起散列并将其作为另一个 header 发送:

X-Hash: sha1('POST /something' + 'X-Key: thekey' + secret);

现在可以以明文形式发送请求,并且由于哈希函数是单向的,因此无法恢复 secret 。服务器将接收该数据并使用它查找thekey的 secret 重新散列。如果计算出的哈希值与X-Hash的值匹配,那么它就知道只有拥有授权 key 和 secret 的人才能发出(或签署)此请求,我们应该继续。

这个计划有一个很大的缺陷......它允许重放攻击。有两种方法可以解决这个问题。最简单且通常足够有效的方法是向请求添加到期日期。

POST /something?expires=2015-09-01T11:45:00Z

由于每个签名的请求都有自己的哈希值,因此有人无法简单地更改到期日期而不使请求无效。然后只能重播该请求,直到过期为止。

防止重放攻击的更可靠方法,但更难实现,是使用随机数。基本上,您向请求添加一些数据,然后将其存储在数据集中并 promise 不再使用。理想情况下,它是一个随机数。

POST /something?nonce=oijwioj3wdlkjfoj234234ojwefoij

如果有人尝试重播此请求,您的服务器会通过检查随机数数据库发现该随机数已被使用,然后拒绝该请求。

这就是 HMAC。现在,您可能注意到这并不能直接解决您的问题,因为至少您需要一种查找 key / secret 的方法。这是您发挥创意的地方。

您可以根据另一个 key 以编程方式生成 key 。也许最初分发此 session key 的服务器拥有某种主 key ,并为其派生其他 key 和 secret 。也许通过使用我们的主 key 对 X-Key 中客户端指定的 key 进行哈希处理,我们可以获得secret。这意味着如果您需要撤销,您将必须更改主 key (以及所有 key / secret ),但这在您的情况下可能是可以接受的。也许我们会在每次请求时轮换 key 并设置过期日期。有很多方法可以处理这种情况,但这取决于您的具体要求。

重点是构建一个根本不需要查找即可验证请求是否已授权的系统。如果请求包含足够的信息,这是可能的。您真正需要的只是请求上的签名,该签名只能由授权方计算。我想您会发现这非常适合您的问题。

关于多核或单核上的多个 Node 实例上的 Node.js 集群模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32336569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com