我正在考虑构建一些利用websockets的内部网应用程序。我目前在服务器上使用Python/Pylons为我的web框架,并做轮询来更新页面DOM中的项目。Pylons不太适合与websockets通信(IMHO),因为它每个连接使用一个线程。我正在考虑使用node.js作为服务器与我的web应用程序的websocket连接进行通信。这是我的应用程序的"10,000英尺视图":
- Pylons提供web内容(html, css,图像,javascript等)
- javascript在页面应用程序打开websocket(s)到node.js服务器
- node.js服务器通过websocket向应用推送数据
- JavaScript根据来自websocket 的数据更新页面DOM元素
上面的数据来自MySQL数据库,这就是我的问题的来源。我之前已经设置了MVC类型的应用程序,并且可以在node.js中做同样的事情。然而,如果我有一个长期存在的websocket开放给node.js服务器,node.js如何意识到模型中的变化并将它们推出到应用程序?例如,如果我想更新web应用程序页面上呈现的总数,并且这些总数由于node.js(其他web应用程序)之外的系统中的动作而更改,node.js如何通知这些更改?我想到的是让node.js在数据库中轮询各种更改,并将更改传播到各种视图。但对我来说,这听起来就像我把我的轮询从web应用程序到node.js服务器?
谁有什么想法,建议或指针吗?提前感谢!道格
您可以:
- 让Python脚本通知node.js应用程序(通过socket或HTTP)
- 或者从node.js轮询,因为它不知道外部环境的变化
轮询被认为是不好的,因为它不能扩展。当只有一个进程时,轮询可以扩展,因为当另一个用户连接时,它不需要更多的连接。所以基本上:
// query every second or so
setInterval(function () {
// query database
doSomeDatabaseStuff(function (res) {
// check dirty
if (res.changed) {
// notify all clients
allConnectedSockets.forEach(function (socket) {
socket.send({ msg: "update" });
});
}
})
}, 1000);
这样你就有一个单一的进程轮询数据库,和一个可扩展的架构来通知你连接的客户端。数据库仍然可以从任何来源填充
Sails.js是一个用于节点的MVC框架,它具有restful路由Socket的独特之处。
Sails目前使用Sequelize,默认配置为使用mySQL(但也支持SQLite和Postgres)。我们正在切换到一个允许您选择自己的ORM的模型,这将允许我们支持JugglingDB(它增加了对Mongo的支持,以及其他)
它还捆绑了一个前端组件Mast。Mast提供了与Meteor类似的功能,因为它允许您从客户端直接与数据库通信。如果你需要提供更复杂的功能,你只需要在后端添加一个控制器。
更多信息:https://github.com/balderdashy/sails