Node.js + Socket.io + MongoDB webapps如何真正异步?

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.jsPHP /阿帕奇/ 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)


flo*_*mas 7

使用:

  • 作为商店的常规MongoDB Collection ,
  • 带有Tailable游标的MongoDB上限集合作为队列,
  • 一个带有Socket.IO的Node工作者,将Queue视为Worker,
  • 一个节点服务器,用于为Socket.IO客户端提供页面服务,并接收POSTed数据(或者另外添加数据)作为服务器

它像:

  1. 新数据被发送到服务器,
  2. 服务器将数据放入商店,
  3. 服务器将数据的ObjectID添加到队列中,
  4. 队列将新到达的ObjectID发送到Worker上的打开的Tailable Cursor,
  5. Worker从Store中获取ObjectID中的实际数据,
  6. Worker通过套接字发出数据,
  7. 客户端从套接字接收数据.

这是从最初添加数据一直到客户端接收的"推送" - 没有轮询,所以实时,因为您可以获得每个步骤的处理时间.