如何使用 websockets 从 mysql 获取实时通知更新?

The*_*der 1 java mysql spring websocket spring-boot

从几天开始,我一直在搜索社交网络或问答网站如何获得实时通知。我开始了解订阅者-发布者模式。我开始知道实时更新是使用 WebSockets 获取的。Websocket 发布一个端点,客户端订阅该端点并不断获取任何更改的更新。
但是我从网上得到的例子都是聊天应用程序。但我的要求是从 MySQL DB 获取实时通知。所以我有几个问题

  1. 我是否使用 WebSockets 来满足正确的要求?或者还有其他一些有效的方法可以满足我的要求?
  2. 如果这对我来说是有效的方法,那么我认为解决这个问题的模式是:WebSocket 将连接到 MySql 并始终查找更改。它还发布了一个端点,我的客户将始终寻找该端点。提交到 Mysql 的任何更改都将反映在 WebSocket 中并导致客户端应用程序。

如果我的模式是对的,我不知道如何将 WebSocket 连接到 Mysql。任何帮助/指导都非常感谢。

更新
经过一些更多的网络搜索:
1. 由于我正在为我的网站创建 Rest Webservices,AJAX 是实现通知功能而不是 WebSockets 的更好方法吗?
2. WebSockets 的实现是否比击中 Rest 端点的 AJAX 调用复杂(因为两者的目的是相同的,以获得通知)?

Mys*_*yst 6

我是否使用 WebSockets 来满足正确的要求?

实时通知是 Websockets 蓬勃发展的地方,它比 AJAX 提供了巨大的优势。

如您所知,在讨论AJAX 的作用(非常适合 CRUD,而不是轮询时)和比较Websocket 性能与 AJAX 性能(Websockets 在实时更新方面总是更快)时,这已经讨论过了。

或者还有其他一些有效的方法可以满足我的要求?

是的...您可以通过向on_update数据库访问点添加“挂钩”来节省资源并提高性能(以及未来的代码维护问题)。

想法很简单:每当函数调用更新 MySQL 数据库时,更新请求也会发送到回调。该回调负责将更新发布到正确的频道。

这样,您就不会轮询 MySQL 数据库。

一些数据库提供更新回调,而另一些则不提供。我认为 MySQL 可以。但是,我避免使用这些数据库链接回调,因为它们是特定于数据库的。最好(恕我直言)将回调添加到应用程序中的数据库访问点,因此替换数据库不会影响代码库。

  1. 由于我正在为我的网站创建 Rest Webservices,AJAX 是实现通知功能而不是 WebSockets 的更好方法吗?

我不认为 AJAX 是一个好方法。

HTTP/2 有助于减轻 AJAX 的缺点,但并不能解决所有这些缺点。

我不知道您希望同时连接多少个客户端,但是强制客户端每两秒钟发送一个请求非常接近于自我造成的 DoS 攻击。

考虑一下:如果客户端每两秒发送一个 AJAX 请求,而不是 2,000 个并发客户端,则您的服务器将需要响应 1,000 个请求/秒 - 其中包括身份验证、数据库查询和所有爵士乐。

另一方面,使用 Websockets,有 2,000 个连接的客户端,您有 2,000 个持久连接在消息到达之前什么都不做。不需要 CPU 或工作,只需要连接的内存。在推送实际数据之前,服务器上没有压力。

  1. 实现 WebSockets 是否比击中 Rest 端点的 AJAX 调用复杂(因为两者的目的是相同的,以获得通知)?

是的,它们实施起来更复杂,但一旦你开始,它们就没有那么难了。此外,还有许多库和辅助工具可以减轻您的大部分工作。

与 Websocket 方法相关的常见问题包括水平扩展的处理(通常通过添加发布/订阅数据库或服务,例如 Redis)、消息排序(在可能的情况下最好忽略)和数据传播问题(我们何时标记数据为“可见”?我们是发送整个数据还是仅发送说明数据可用的通知?我们使用多少个渠道以及我们如何划分订阅?)。

通常答案是特定于应用程序的,并且取决于您尝试展开的功能以及数据集的预期大小(如果我在 SO 上给出的每个答案都是一个频道,那么维护将是不切实际的)。

总之……祝你好运!