我们正在尝试构建一个实时更新数据的Web应用程序。为了做到这一点,我们考虑使用socket-io。
所以计划是:
但是,我们遇到了一个我们无法解决的问题:
我们怎么可能知道另一个视图是否已经改变?由于我们的应用程序从计算对象的视图中提取,如果客户端更新viewA,则viewB中的行也完全可能已更改(由于它们共享基础表)。如果viewB会议室中有第二个客户端(套接字),它将不会获得更新的viewB实体,并且将与数据库不同步。
即使我们在会话中存储了对基础表的视图散列并使用它来预测哪些视图可能在更新时发生了变化,我们仍然不知道哪一行具体改变了?
寻找想法或方法,欢迎所有的想法。提前谢谢。
答案 0 :(得分:0)
您还必须考虑以下事项:您将在生产服务器中运行多少个Node JS实例?每个Node JS实例都有自己的内存空间和进程,因此,它自己的用户视图副本。那么,我们如何同步它们呢?
socket.io-redis
为此提供了帮助,因为所有Node JS实例都指向它。然后使用socket.io-emitter
,可以从任何实例向客户端发送事件。
var io = require('socket.io-emitter')({ host: '127.0.0.1', port: 6379 });
setInterval(function(){
io.emit('time', new Date);
}, 5000);
如果上面的示例中,host
和port
是Redis所在的位置。然后,在下一行代码中,您可以看到io每隔5秒向所有客户端发送一次时间,无论客户端连接到哪个Node JS实例。我经常使用这种架构而且效果很好。
有了这个介绍,现在适合你的情况。我假设您正在谈论RDBMS,因为您在问题中提到了“视图”,“行”,“插入”等字样。如果是这种情况,问题的一个解决方案就是socket.io
对Redis所做的事情:它以发布/订阅的方式“监听”Redis事件。我不知道你正在使用什么RDBMS,但是一种监听数据库事件(没有轮询视图)的方法是通过触发器或监视数据库日志文件。事实是,RDBMS对于pub / sub事件并不是那么好,但是你的用例正是如此。是否可以从“计算对象”中监听事件(他们发布消息)?如果没有,并且您需要坚持使用RDBMS,您可以使用触发器/日志,也可以经常轮询数据库以查看表/视图更改。然后,通过socket.io
(很可能是socket.io-emitter
),您可以将这些更改推送到`socket.io-clients'。
使用RDBMS并不是一种简单的实时制作方法,你可能不得不接受“近实时”。如果绝对需要实时,您需要一个过程来监听上面提到的视图更改,或者,如果可能的话,采用具有pub / sub功能的数据库。
我无法了解更多细节,因为我对您想要的架构了解不多,但请随时通过评论添加更多详细信息,我会尽力帮助您。