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

时间:2018-02-08 15:06:01

标签: java mysql spring spring-boot websocket

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

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

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

1 个答案:

答案 0 :(得分:2)

  

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

实时通知是Websockets茁壮成长的地方,并且提供了超过AJAX的巨大优势。

如你所知,在讨论the role of AJAX(对CRUD很好,而不是在轮询时)以及比较Websocket performance vs. AJAX performance时,已经讨论过这一点(在实时更新方面,Websockets总是更快) 。

  

或者我的要求有其他有效的方法吗?

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

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

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

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

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

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

HTTP / 2有助于缓解AJAX的缺点,但它并没有解决所有这些问题。

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

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

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

  
      
  1. 实施WebSockets比执行Rest端点的AJAX调用要复杂(因为两者的目的相同,是为了获取通知)?
  2.   

是的,它们实施起来比较复杂,但一旦开始它们就不那么难了。此外,还有许多图书馆和帮助工具可以完成大部分工作。

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

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

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