在没有轮询器的情况下基于MySQL DB创建Node.js仪表板

时间:2015-10-21 13:23:03

标签: javascript php mysql ajax node.js

我已经阅读了一些与此主题相关的StackOverflow帖子,但我无法在我的方案中找到任何特别有帮助的帖子。

我们的网络中有多个监控实例,监控不同的环境(Nagios,Icinga,更多......)。目前我有一个用PHP编写的轮询器脚本,它通过cron每分钟运行一次,它要求实例以JSON的形式返回所有问题,然后脚本解释它并将其推送到MySQL数据库。

然后有一个概述'只读取数据库并进行一些格式化的页面。有一点涉及AJAX,每X秒(目前使用30)它检查更改(PHP脚本调用),如果有更改,它通过AJAX请求它​​们并更新页面。

还有其他一些小问题(单击一个问题,另一个AJAX请求将获取问题详细信息以显示在模态中等)。

我一直都是PHP / MySQL开发人员,因此上述方法对我来说似乎合乎逻辑,并且快速/易于编写,并且它可以正常运行'。然而,问题是:数据库不断被许多用户轮询,前端的javascript网格做了一半的逻辑而PHP的网格做了另一半。

这个用例会因切换到NodeJS而受益吗?我以前做过一点Node.JS,但没有这样的。我可以订阅MySQL更新吗?或者在“数据提取程序”时触发它们。将数据推送到数据库?我一直有点困惑,因为我使用PHP来创建数据和javascript来绘制'那个页面,还有NodeJS做逻辑和前端javascript创建所有元素的分裂,还是NodeJS现在做了所有这些?很抱歉这方面缺乏知识......

1 个答案:

答案 0 :(得分:2)

这绝对是Node可以提供改进的领域。

简短版本:前端和常规套接字中的websockets或后端的API可以消除对全新数据的轮询。

长版:

  • 前端:

您可以通过实现websockets删除对轮询脚本的所有需求。这样,只要新数据到达服务器,您就可以将其广播到所有连接的客户端。我会建议Socket.ioPrimus websocket包装器。两者都非常容易实现,并且非常强大,可以实现您想要实现的目标。

所有数据处理逻辑都应该在服务器上进行。然后将数据发送到客户端,并应在现有页面上呈现,这基本上是客户端应该包含的唯一逻辑。有一些框架可以为您完成所有这些(例如Sails)但我没有任何这些框架的经验,因为它们要求您根据他们的规则编写整个应用程序,我个人不喜欢不喜欢(但我知道很多开发人员都这样做。)

如果你想在没有庞大框架的情况下在客户端中呈现数据,我强烈推荐使用轻量级但非常有用的Transparency渲染库。使用此方法,您可以使用Node格式化服务器上​​的Javascript对象,将其发送给客户端,然后客户端必须做的就是对其进行解除JSON化并调用透明度.render

  • 后端:

这个取决于您对需要检查的实例的行为有多少控制权。我假设您有一些控制权,因为您可以以一种漂亮的JSON格式获取所有数据。所以,有多种选择。

  1. 您可以经常进行轮询。这是最简单的解决方案,因为它不需要更改外部服务。 Javascript setInterval函数在这里非常有用。根据您与实例的连接方式,您可以使用Request这样的模块来执行实际请求,这样可以解决更多繁重的问题。

    在您的Node应用程序中实现轮询的好处是,您将在Node应用程序中接收数据,并且即使在将其插入数据库之前,您也可以立即将其广播到客户端。这将大大减少数据库中的查询数量。

  2. 轮询的另一种选择是建立一个简单的基于Express的API,应用程序可以在调用它们时发布“问题”。这样,您的应用程序将在出现问题时得到通知,并与websockets连接到客户端,这将导致实际的实时更新。

    为了更加冗余,你可以在API旁边安装一个轮询计时器,以便在出现错误导致他们不再发送任何数据的情况下检查实例。

    更高级API的替代方案是使用直接套接字通信,这基本上只是使用一组不同的函数。

  3. 最后,您还可以保留基于PHP的轮询脚本。这将是最有效的解决方案,因为你不会去替换所有东西。然后,从连接到带有websockets的客户端的Node应用程序,您可以设置一个间隔,以便经常查询数据库并广播更新。这仍然会大大减少查询次数,因为无论连接多少个客户端,只会有一个查询,然后将响应发送到所有连接的客户端。

  4. 我希望我的帖子能为您提供有关如何使用Node实现应用程序的一些想法。请记住,虽然我只是一个开发人员,但这是我在Node中构建应用程序的方法。肯定会有其他人有不同的意见。