SQL Server 实时推送通知到 Node.JS
本文关键字:知到 Node JS 通知 Server 实时 SQL | 更新日期: 2023-09-27 18:34:28
我正在构建一个Web应用程序,简而言之,它在SQL Server和Node中获取结构相当差的数据.JS并将其移植到MongoDB。 我需要这样做的原因是,我需要从一个编写得相当糟糕的应用程序访问数据,该应用程序对于一个组织至关重要,我无法更改输入初始数据的代码。 翻译完成后,我可以让我的应用程序完成业务所需的操作。
现在,我的应用程序每30分钟轮询一次SQL Server以进行更改,然后通过Node.JS更新我的MongoDB,并且由于数据量大,不希望更频繁地轮询。
我需要做的是将来自SQL Server的实时通知以某种方式推送到我的Node.JS应用程序,无论是主动还是被动,都没有Node.JS结束,以便它可以更新我的Mongo数据库。
我用来获取数据的节点库是:https://github.com/patriksimek/node-mssql
我有几个可能的想法:
- 让 SQL Server 向我的 NodeJS HTTP 服务端点发送某种通知
- 让 NodeJS 运行一个流查询,每次进行更改时,该查询都会在我的端运行
- 用 C# 编写一个应用程序来监视这些更改并将它们推送到我的 NodeJS HTTP 端点。
这个问题,但大多数似乎都在谈论数据源起始点的更改(我无法更改(,而不是来自SQL Server本身。
我也有类似的情况,经过研究,我将采用的解决方案是编写一个.Net Core Windows服务,该服务除了侦听来自SQL Server的查询通知外什么都不做。当通知到达时,它将到达 nodejs REST 端点,通知它更改,并允许 nodejs 应用程序根据需要查询和处理数据。
我搜索并搜索了一种从nodejs执行查询通知的方法,但似乎不存在任何内容。您需要一个 .Net 应用程序。
但是,也就是说,另一种可能性不是编写.Net Core Windows服务(如果需要,也可以编写 ASP.Net 应用程序(是使用EdgeJs实际运行与nodejs应用程序内联的.Net程序集(在同一进程中(。
我决定不走这条路,而是做Windows服务。但它也应该是可行的。
(我也意识到这个问题已经有 2 年了,所以你可能已经完成了这个项目,但我会把这些答案留在这里留给后人(
我必须首先说我没有实时解决方案。如果有实时解决方案,我不知道。我只想谈谈减少民意调查的负担。
我假设您可以控制SQL Server本身。您可以在 SQL Server 中设置一些内容来跟踪更改,并让轮询仅查看尚未由 Node 拉取的更改。
您是否可以控制更新/插入过程?如果您这样做,很容易将更改跟踪代码放在插入/更新代码旁边。我假设你没有,在这种情况下,我建议*查看triggers
.这些基本上是附加到表的事件侦听器,允许您在插入/更新表之前、期间或之后执行 SQL,并允许您访问使用 deleted
和 inserted
表更改/插入的数据。
* SQL Server 社区不喜欢触发器的原因有很多,其中一些原因在这篇 SQLServerCentral 文章中进行了讨论。要点:它们很难调试,当它们成为写入操作的一部分时会降低性能,并且注意不要创建循环触发器(更新表1触发trig1,更新表1,触发trig1等(。因此,如果要使用表上的触发器执行更改跟踪,请创建一个单独的表来跟踪这些更改,并且仅让触发器更新/插入该表。
现在,您可以设置一个更改跟踪表,触发器会填充所做的任何更改以及何时进行更改,甚至可以设置一个bit
字段来说明 Node 是否已提取这些更改。现在你所要做的就是让 Node 查看该表,只拉入它尚未拉入的更改。这张表可能会很快变得很大,因此对于民意调查来说很慢,所以我建议在标志或字段上放置一个index
,说明进行更改的日期。现在,由于轮询速度很快,您应该能够减少间隔。
这不是一个理想的解决方案,可能需要做很多工作,所以最好等一会儿,看看是否有人想出更好的解决方案。
可以使用触发器和 CLR 存储过程解决此问题。更新表后,您可以执行 CLR 存储过程,例如向 Nodejs 发送通知。