从我的Web服务器上获取CPU密集型作业的选项?

时间:2018-02-07 15:31:58

标签: node.js websocket socket.io amazon-dynamodb

我一直在开发一个用于可视化实时数据的Web App。至关重要的是,这些数据在客户端保持最新,而客户端不直接调用这些更新(例如,没有按钮按下或刷新页面)。目前,在页面加载时,我通过Ajax从数据库(DynamoDB)获取当前数据集,随后的更新通过Websockets连接(使用Socket.io)每5分钟推送到任何侦听客户端。

我忽略了此更新作业的计算负荷。它必须挖掘一些数据,处理它们,更新数据库,并将更新发送给所有客户端。因此,每次更新都会使Web服务器无响应约30秒。此外,我目前的架构限制我将我的服务器置于负载均衡器之后,这是我预计未来会出现的。出于这两个原因,我真的需要从我的Web服务器上获取此更新作业。

我在网络开发方面相对缺乏经验,我觉得我对这些技术知识渊博,不知道我提出的解决方案的缺点。目前,我正在考虑:

  1. 将更新分解为单独的进程,因此它不会阻止Node事件循环。这可以在短期内解决我的问题,但如果我想对我的应用程序进行负载均衡,我就无法在多台机器上运行更新。

  2. 完全删除Websockets并让客户端每5分钟查询一次数据库,而单独的进程(如果我想要负载平衡,则为单独的服务器)可使数据库保持最新状态,而无需直接与客户端交互。这种访问模式会对我的数据库造成太大负担吗?

  3. 让一个单独的服务器运行更新,并通过Websockets(或者某些其他协议)将结果发送到我的负载平衡应用程序服务器,然后像往常一样将该更新推送到所有侦听客户端。这甚至可能吗?

  4. 也许还有其他解决方案。这似乎是一个相对常见的问题,所以我希望我能在这里找到一些指导。我提出的解决方案存在哪些潜在问题,是否有其他可能的解决方案更适合我的用例?

3 个答案:

答案 0 :(得分:0)

听起来你想要一个过程坐在某个位置,它会压缩数据并将其发布到流中。然后,客户端可以在他们喜欢的时候订阅流。 Redis可以很好地处理流,您可以处理数据并将其推送到redis流中。然后,您可以创建一个小节点服务,该服务订阅redis流并通过websocket或通过轮询推送格式化数据。

在这种情况下,如果您的数据负载增加,您可以扩展发布过程(处理数字的过程),或者扩展您的订阅过程(通过websocket向浏览器提供数据)观看数据的客户涌入。

您还可以轻松地在其他计算机上分发这些服务的托管,如果您确定数字处理需要类似线程的话,甚至可以用不同的语言编写它们。

然后,你会发现消费这些数据的客户端(网络浏览器)问题,其间存在负载平衡。如果你使用websockets并且捆绑了优点和缺点,这可能是一个难题。但重要的是,您已将数据处理与结果发布分开,并且将您的问题隔离到仅负载平衡。

答案 1 :(得分:0)

我在检查某些服务器上的资源时也做了同样的事情。 我有一个C#服务获取我们管理的每个服务器上的信息,并将它们发送到队列(Amq)。

从那里开始,我有一个stomp客户端从amq获取数据并将它们发送到websocket。

我的主要微服务是获取数据以将它们保存到数据库中。

我的可视化webapp连接到相同的ws,并在发送数据时获取数据。

Amq步骤根本不是强制性的,它只是我必须使用的东西(历史)。

我不知道您正在使用哪种类型的数据,因此我不知道我的解决方案是否适用于您。 如果我不清楚或你有任何疑问,请不要犹豫。

答案 2 :(得分:0)

这是一个很大的问题,我不会试着给你一个明确的答案。

对于选项2

这实际上取决于您的查询有多贵。如果您支付足够的吞吐量,您可以快速制作DynamoDB。也就是说,面对它,重新加载整个数据集,当听起来像它可能很大时,可能不是很好的工程。

对于选项3

如果这个选项可以实现,这个选项对我来说似乎是最好的,虽然很难说这么复杂的系统很难说 - 显然你不能分享你的整个项目。

鉴于您已经在使用AWS,您可能需要查看AWS Lambda。如果您可以将更新过程移动到独立作业,则可以将其托管在lambda上并将负载从Web服务器上移除。 Lambda本质上是无限可扩展的,您只需为您使用的计算付费。

这实际上取决于您是否可以将更新任务拆分为单独的服务。您可能需要进行一些重构才能将其隔离为服务。如果你可以一次性打破一点点,并逐步采取行动,甚至更好。

如果你考虑尝试这个,而你之前没有使用过Lambda,我肯定会从一些你好的世界例子开始。然后在您的应用程序中尝试一个非常简单的服务,并构建以接受更新服务。

您也可以考虑查看AWS Simple Message Queue Service来处理客户端和服务器之间的通信。

数据库调整

如果花费大量的更新时间等待数据库操作完成,而不是服务器处理,则可以考虑调整这方面的内容。需要考虑的事项是:

  • 购买更多吞吐量
  • 使用批处理操作(因为这些操作从服务器移动到DynamoDB)
  • 调整密钥,索引和数据库访问