【问题标题】:WebSocket listener for Microsoft SQL DatabaseMicrosoft SQL 数据库的 WebSocket 侦听器
【发布时间】:2021-04-02 05:16:16
【问题描述】:

我目前正在开发一个项目,该项目必须使用 WebSockets 作为向我的客户端传输数据的一种方式。基础设施如下所示。
客户端 --> Web 服务器 --> Microsoft SQL 数据库

我认为最理想的情况是这样的: 客户端打开一个到服务器的套接字。 服务器打开一个到 Microsoft SQL 数据库的套接字。 每当更新数据库(已插入一些数据)时,数据库都会将数据写入套接字。 服务器将数据写回客户端。 不过,这可能有点乏味,也许我可以以某种方式直接从客户端打开一个到数据库的套接字?

我想知道是否有办法在 MSSQL 数据库更新时自动将套接字通知给 Web 服务器,以便它可以处理该信息。

主要问题是真的;我将如何进行这项工作?我研究了一些使用 WebSockets 的项目,比如 Node.JS 和 Socket.IO,还有 Tornado。虽然我还没有找到任何关于在哪里寻找这个特定功能的线索。我为 NodeJS 的 MSSQL 数据库找到了一些相当不稳定的驱动程序,但不明白是否有任何方法可以创建一个到 DB 的套接字并在数据被泵入数据库时​​立即通过套接字发送数据。

我也意识到,在客户端和数据库之间建立一个套接字,至少可以说是安全的,因为现在这不是问题,而且 SQL 不是实时应用程序的方式,但我是现在绑定到它:)

编辑 1:

感谢@tomfanning,我现在知道了解决此问题的方法,但严重怀疑性能的改进。让我为你描绘一下情况。如果我会在 MSSQL 数据库上使用触发器,我想会发生这种情况。

情况1

  1. 数据库更新
  2. 扣动扳机
  3. CLR 脚本与 Web 服务器建立连接。要么通过 每个触发器或通过它必须打开和关闭的套接字 涉及打开和关闭标头的 HTTP(S) 请求(其中 是无用的开销)
  4. Web 服务器接收到触发器并将数据发送到 客户。
  5. 客户端更新。

现在想象同样的场景,但使用 AJAX

情况2:

  1. 客户端为 AJAX 请求设置了 1000 毫秒的超时时间
  2. 客户端超时并发出 AJAX 请求
  3. 数据库执行一些查询并回发结果
  4. 客户端更新。

在情况 1 中,您需要一个请求和一个套接字发送/接收,而在情况 2 中,您只需要一个请求。如果我将 AJAX 请求的超时设置为 10 毫秒,用户会不会觉得它是一个像 websocket 这样的实时应用程序?还是情况 1 会更有效,我只是在夸大其词?

提前致谢!

【问题讨论】:

  • 如果您可以通过 websockets 以不安全的方式访问您的数据库,我也可以。如果我可以访问您的数据库,我会为 lulz 拖钓它。安全不是开玩笑。
  • @Raynos 我知道安全性不是玩笑,我一定会考虑到它。但我现在只需要知道是否有办法做到这一点。

标签: database sockets node.js websocket socket.io


【解决方案1】:

可能的解决方案可能是T-SQL triggers on INSERT or UPDATECLR procedure,它将一些通知发送到您的主应用程序,然后通过websockets 将数据泵出到您的客户端。将避免需要轮询数据库。

根据您的评论 - 不确定在这种情况下 AJAX 将如何具体帮助您 - 因为作为一种由客户端(浏览器)驱动的技术,您的解决方案将再次进行轮询,我知道您希望避免这种情况。 WebSockets 在这里听起来很合适,因为它使您能够真正从服务器“推送”到客户端,而无需轮询。

显然我在这里谈论的是非常笼统和理论的术语。

【讨论】:

  • 我确实打算避免轮询并且确实想在我的应用程序中使用 WebSockets。但是想象一个触发器被拉动并且脚本被执行,数据库必须通过套接字建立到 Web 服务器的连接,或者它将请求作为链接或类似的东西打开。这意味着它必须建立一个我想避免的 Header 由于开销。如果我要从客户端向服务器发出 AJAX 请求,它将需要一个请求而不是 1 个请求 + 套接字传输,对吗?
  • 在我能想到的任何情况下,让任何客户端代码直接与数据库服务器通信,这绝不是一个明智的想法。所以你总是会有某种形式的中间件,因此总共有两个连接(一个在客户端和 Web 服务器之间,一个在 Web 服务器和数据库服务器之间)而不是一个,不管技术如何。如果您客户端启动更新,您将始终处于轮询模型中,该模型的可扩展性不如推送模型。如果你想要一个真正的推送模型,你需要从数据库端以某种方式启动操作。
  • 我刚刚也想过,数据库中的 INSERT 或 UPDATE 触发器只会打开一个到 Web 应用程序的连接,而该连接又可以知道很多(数十、数千……)需要通过 WebSockets 接收推送通知的客户端。这比让成千上万的客户端定期发送 AJAX 请求来轮询更新要好得多,这反过来会给数据库带来很大的压力。
  • 我完全同意并理解这一点,但是性能呢? T-SQL 触发器模型会比 AJAX 请求轮询方法更有效吗?
  • 在我看来,是的,很有可能。最好将数据库中的一条消息“我有新数据”发送到 Web 应用程序,并让 Web 应用程序对客户端说“这里有一些新数据”,而不是让多个客户端定期请求Web 应用程序询问“你有新数据吗?”,导致 Web 应用程序(针对每个客户端请求)询问数据库“你有新数据吗?”,因为它大部分时间都回答“否” - 一条消息需要发送给每个客户。总共通过的流量要少得多。此外,您的应用程序最终应该更具响应性。你应该试试看!
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
相关资源
最近更新 更多