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

标签 java mysql spring spring-boot websocket

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

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

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

更新:
经过更多的网络搜索:
1. 由于我正在为我的网站创建 Rest Web 服务,AJAX 是否比 WebSockets 更适合实现通知功能?
2. WebSockets 的实现是否比 AJAX 调用击中 Rest 端点更复杂(因为两者的目的相同,都是为了获得通知)?

最佳答案

Am I using the WebSockets for the correct requirement?

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

如您所知,双方在辩论 the role of AJAX 时已经讨论过这个问题(非常适合 CRUD,轮询时不是那么好)和比较 Websocket performance vs. AJAX performance 时(在实时更新方面,Websockets 总是更快)。

Or there is some other efficient way for my requirement?

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

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

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

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

  1. Since I am creating the Rest Webservices for my website, is AJAX the better way to implement notification feature instead of WebSockets?

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

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

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

考虑一下:如果客户端每两秒发送一次 AJAX 请求,那么在 2,000 个并发客户端的情况下,您的服务器将需要响应 1,000 个请求/秒 - 这些包括身份验证、数据库查询和所有爵士乐。

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

  1. Are WebSockets complex to implement than AJAX calls hitting Rest endpoint (since the purpose of both is same, to get notifications)?

是的,它们实现起来更复杂,但一旦开始,它们并不难。此外,还有许多库和帮助工具可以减轻您的大量工作。

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

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

无论如何...祝你好运!

关于java - 如何使用 websockets 从 mysql 获取实时通知更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48688604/

相关文章:

java - Hibernate一对多映射(注解)

mysql冲突的where子句

mysql - 在 MySQL WHERE 子句中获取当前年份

php - 随机洗牌而不会再次得到相同的结果

java - JPA ManyToOne 字段未存储

spring - 如何在Spring Boot中禁用H2的DATABASE_TO_UPPER,无需显式连接URL

java - 如何使用 RxJava 取消 Retrofit 中的单个网络请求?

java - 即使触发了正确的事件,GUI 也不会更新当前信息

java - 只能与 Theme.AppCompat 主题(或后代)一起使用的 AppCompat 小部件

java - 如何在JSTL中使用AOP?