【问题标题】:Creating a Node.js dashboard based on a MySQL DB without a poller在没有轮询器的情况下基于 MySQL 数据库创建 Node.js 仪表板
【发布时间】:2016-01-20 12:30:34
【问题描述】:

我已经阅读了一些与此主题相关的 StackOverflow 帖子,但在我的场景中我找不到任何对我有特别帮助的内容。

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

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

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

我一直是 PHP/MySQL 开发人员,所以上面的方法对我来说似乎是合乎逻辑的,而且写起来很快/容易,而且效果很好。但是,问题是:数据库不断被许多用户轮询,前端的 javascript 网格负责一半的逻辑,而后端的 PHP 负责另一半。

这个用例会从切换到 NodeJS 中受益吗?我之前做过一些 Node.JS,但没有像这样。我可以订阅 MySQL 更新吗?或者当“数据获取器”将数据推送到数据库时触发它们?当我使用 PHP 来创建数据和 javascript 来“绘制”页面时,我总是有点困惑,是否仍然有 NodeJS 的分裂做逻辑和前端 javascript 创建所有元素,或者 NodeJS 现在做所有这些?抱歉,缺乏这方面的知识...

【问题讨论】:

    标签: javascript php mysql ajax node.js


    【解决方案1】:

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

    短版:前端使用 websocket,后端使用常规套接字或 API,您可以消除对新数据的轮询。

    长版:

    • 前端:

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

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

    如果你想在没有庞大框架的情况下在客户端渲染数据,我强烈推荐轻量级但非常有用的Transparency 渲染库。使用它,您可以使用 Node 在服务器上格式化 Javascript 对象,对其进行 JSON 化,将其发送到客户端,然后客户端所要做的就是对其进行反 JSON 化并调用 Transparency 的 .render

    • 后端:

    这取决于您对需要检查的实例行为的控制程度。我假设您有一定的控制权,因为您可以以良好的 JSON 格式获取他们的所有数据。所以,有多种选择。

    1. 您可以每隔一段时间继续投票。这是最简单的解决方案,因为它不需要更改外部服务。 Javascript setInterval 函数在这里非常有用。根据您与实例的连接方式,您也许可以使用 Request 之类的模块来执行实际请求,从而减轻更多繁重的工作。

      在 Node 应用程序中实施轮询的好处是,您将在 Node 应用程序中接收数据,这样您就可以立即将其广播给客户端,甚至在将其插入数据库之前。这将大大减少对数据库的查询次数。

    2. 轮询的替代方法是设置一个简单的基于Express 的API,应用程序可以在其中发布它们的“问题”,正如您所说的那样。这样,您的应用程序将在出现问题时收到通知,并结合与客户端的 websockets 连接,这将导致几乎实时更新。

      为了更加冗余,您将在 API 旁边有一个轮询计时器,以便您可以检查实例,以防出现导致它们不再发送任何数据的错误。

      更高级 API 的替代方案是仅使用直接套接字通信,这与使用不同函数集的方法基本相同。

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

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

    【讨论】:

    • 谢谢,这非常有用,我将阅读您所链接的一些技术。
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2015-09-24
    • 2011-07-13
    相关资源
    最近更新 更多