dan*_*dan 22 sockets near-real-time nonblocking node.js
我有一个很好的旧式LAMP webapp.一周前我需要为它添加推送通知机制.
因此,我所做的是在服务器上添加node.js + socket.io并使用node.js每隔10秒轮询MySQL数据库以检查是否有新项:如果有,我会将它们发送到客户端( s)与socket.io.
我对结果非常满意,即使这不是一个正确的实时通知(因为有一个长达10秒的滞后).
现在,我即将构建一个新的webapp,它也需要推送通知.我想知道是否采用与第一种方法相同的方法(我相信它更稳定和成熟),或者完全使用Node.js,而不需要PHP和Apache.至于数据库,我已经决定去MongoDB了.
最后,我的问题是:如果我选择Node.js + Socket.io + MongoDB,我会得到一个真正 接近实时的 webapp吗?我的意思是,一旦将新记录插入MongoDB,是否会触发某种事件,我可以通过node.js捕获,对其进行一些检查,如果相关,则将通知发送给客户端?或者,无论如何都会在数据库服务器端进行某种轮询并延迟,就像我的第一个LAMP webapp一样?
一个相关的问题:你可以在MySQL上构建一个实时的webapp,而不像我在我的第一个应用程序那样进行任何轮询.或者你需要MongoDB(或Redis)?
我希望这个问题不是太傻 - 对不起,我刚开始使用Node.js和co.
谢谢.
Ada*_*dam 16
我理解你的问题,因为我切换到的Node.js从PHP /阿帕奇/ MySQL的太多.
通常node.js是稳定的,模块和脚本是导致错误的主要原因
实时与数据库无关,它与客户端和服务器无关,您可以在请求中查询任意数量的数据并将其推送到其他客户端.
选择node.js非常明智,但实现起来比较困难.
当您向数据库插入新记录时,事件就是请求本身,您将与数据库查询一起发出推送事件,例如:
// Please note this is not real code, just an example of the idea
app.get('/query', function(request, response){
// Query your database
db.query('SELECT * FROM users', function(rows){
// Push notification to dan
socket.emit('database_query_executed', 'to_dan', rows);
// End request
response.end('success');
})
})
Run Code Online (Sandbox Code Playgroud)当然你可以使用MySQL!你想要的任何数据库,正如我所说的实时与数据库无关,因为数据库处于流程的中间,而且它是完全可选的.
如果你想使用node.js进行推送通知,使用php/apache进行mysql,那么你需要为每个服务器创建2个请求:
// this is javascript
ajax('http://node.yoursite.com/push', node_options)
ajax('http://php.yoursite.com/mysql_query', php_options)
Run Code Online (Sandbox Code Playgroud)
或者如果你只想要一个请求,或者你想使用一个表单,你可以调用你的php和php内部你可以从php 创建一个http或net请求到node.js,如:
// this is php
new HttpRequest('http://node.youtsite.com/push', HttpRequest::METH_GET);
Run Code Online (Sandbox Code Playgroud)使用:
它像:
这是从最初添加数据一直到客户端接收的"推送" - 没有轮询,所以实时,因为您可以获得每个步骤的处理时间.