单核上的多核或多节点实例上的node.js集群模块

时间:2015-09-01 16:25:21

标签: node.js cluster-computing

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

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

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

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

  1. 在单个核心计算机上运行多个节点实例,并将负载平衡设置为sticky,以便每次客户端发送POST时,它都会转到同一个服务器。这是为了确保我能够根据存储在内存中的会话密钥对客户端进行身份验证。
  2. 使用群集模块在多核计算机上启动工作程序。这样做的好处是它可能更容易维护,因为我不需要运行几个单个实例。
  3. 当我在nodejs.org上查找Cluster时 - 它显示“稳定性:2 - 不稳定”。我正在读这个,因为这不是生产准备。但是看着博客,每个人似乎都建议使用Cluster。

    有没有人在生产环境中实施群集?我应该看看还有其他选择吗?

    提前致谢

1 个答案:

答案 0 :(得分:0)

您可能会考虑像亚马逊那样使用HMAC来做S3而不是。这使您可以验证请求是否已获得授权,但无需保持会话以进行验证。

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

POST /something
X-Key: thekey

现在我们将所有这些与秘密一起散列并将其作为另一个标题发送:

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

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

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

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

由于每个签名的请求都有自己的哈希值,因此有人无法在不使请求失效的情况下更改过期日期。然后,只能在到期时重播该请求。

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

POST /something?nonce=oijwioj3wdlkjfoj234234ojwefoij

如果有人试图重播此请求,您的服务器会通过检查nonce数据库看到此nonce已被使用,然后拒绝该请求。

那个HMAC。现在,您可能会注意到这并不能直接解决您的问题,因为至少您需要一种方法来查找密钥/密钥。这是您可以获得创意的地方。

您可以根据其他密钥以编程方式生成密钥。也许最初分发该会话密钥的服务器具有某种主密钥,它可以为其导出其他密钥和秘密。也许通过使用我们的主密钥散列X-Key中客户端指定的密钥,我们得到secret。这意味着如果您需要撤销,则必须更改主密钥(以及所有密钥/密钥),但在您的情况下这可能是可接受的。也许我们会在每个请求中轮换密钥并且有一个到期日期。有很多方法可以处理这种情况,但这取决于您的具体要求。

重点是构建一个根本不需要查找的系统来验证请求是否被授权。如果请求包含足够的信息,则可以这样做。您所需要的只是请求上的签名,只能由授权方计算。我想你会发现这很适合你的问题。