MySQL触发器通知客户端

时间:2018-04-14 14:09:04

标签: mysql node.js triggers

我有一个Android前端。 Android客户端向我的NodeJS后端服务器发出请求并等待回复。 NodeJS读取MySQL数据库记录中的值(不将其发送回客户端)并等待其值发生变化(另一个Android客户端在不到20秒的时间内使用不同的请求更改它),然后当它发生时NodeJS服务器使用该新值回复客户。 现在,我的方法是创建一个MySQL触发器,当该表中有更新时,它会通知NodeJS服务器,但我不知道该怎么做。 我认为有两种方便忙碌的等待给你一个想法:

  1. 客户端每隔100ms发送一次请求,服务器回复该值的SELECT,然后当客户端获得不同的回复时,表示该值已更改;
  2. 客户端发送请求,服务器每100ms进行一次SELECT查询,直到获得不同的值,然后向客户端回复值。
  3. 两者都是暴力攻击方式,我想不要因为显而易见的原因而使用它们。有什么想法吗?

    谢谢。

1 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow。你的问题非常广泛,我认为我不能在这里给你一个非常详细的答案。但是,我想我可以给你一些提示和想法,可以帮助你在路上。

Mysql没有内部方法将外部命令作为触发器操作运行。据我所知,存在一种外部插件(UDF)形式的解决方法,允许mysql执行您想要的操作。请参阅Invoking a PHP script from a MySQL triggerhttps://patternbuffer.wordpress.com/2012/09/14/triggering-shell-script-from-mysql/

但是,我认为走这条路线是使用错误的架构或错误的设计模式的标志。

我想到的第一个想法是这样的:是否不可能从第二个nodjs请求(更改数据库的请求)到第一个(需要更新的时候)引入某种消息传递DB值变化)?这样,第一个节点“进程”只需要在收到消息时在实际更改时查询数据库。

另一个问题是,如果您确实需要使用mysql,或者某些其他数据存储可能更适合。我想到了Redis,因为使用redis你可以同时实现对nodejs的消息传递......

一般来说,民意调查并不总是错误的选择。特别是对于您希望在每次轮询中收集某些数据的高负载环境。轮询使得数据检索端的处理能力不可能超载,因为该过程控制最大吞吐量。通过推动,你可以将控制权推到推动面,如果有很多这样的推动力,控制就很难实现。

如果我是你,我会研究redis,并了解它的发布/订阅机制如何优雅地用作您的上下文中的消息传递系统。见https://redis.io/topics/pubsub