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

我有一个很好的老式LAMPnetworking应用程序。 一个星期前,我需要添加一个推送通知机制。
因此,我所做的是在服务器上添加node.js + socket.io,并每隔10秒使用node.js轮询MySQL数据库以检查是否有新项目:如果是,我将它们发送到客户端s)与socket.io。
我对结果非常满意,即使这不是一个适当的实时通知(因为有10秒的延迟)。

现在,我即将build立一个新的Web应用程序,它也需要推送通知。 我想知道是否要采用与第一个(我认为更稳定和成熟)相同的方法,或者完全不使用PHP和Apache来完全使用Node.js。 至于数据库,我已经决定去MongoDB了。

最后,我的问题是:如果我去Node.js + Socket.io + MongoDB,我会得到一个真正 接近实时的 Web应用程序? 我的意思是,只要一条新logging被插入到MongoDB中,会不会有某种事件触发我可以通过node.js捕获,做一些检查,如果相关的话,把通知发送给客户端? 或者,无论如何,有一些在数据库服务器端和滞后轮询,如我的第一个LAMPnetworking应用程序?

一个相关的问题:你可以在MySQL上build立一个实时的Web应用程序,而不用像我的第一个应用程序那样进行轮询。 还是你需要MongoDB(或Redis)?

我希望这个问题不是太傻 – 对不起,我刚刚开始与Node.js和合作。

谢谢。

我理解你的问题,因为我也从php / apache / mysql切换到node.js。

  • 通常node.js是稳定的,模块和脚本是导致错误的主要原因

  • 实时与数据库无关,全部是关于客户端和服务器的,您可以根据需要在请求中查询尽可能多的数据,并将其推送到其他客户端。

  • selectnode.js是非常明智的,但实施起来比较困难。

  • 当你插入一个新的logging到你的数据库时,这个事件就是请求本身,你将和数据库查询一起进行一个推送事件,如下所示:

    // 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'); }) }) 
  • 当然你可以使用MySQL! 而任何你想要的数据库,正如我所说的实时数据库与数据库没有任何关系,因为数据库在进程中间,而且完全是可选的。

  • 如果你想使用node.js 推送通知php / apachemysql,那么你将需要为每个服务器创build2个请求,如:

     // this is javascript ajax('http://node.yoursite.com/push', node_options) ajax('http://php.yoursite.com/mysql_query', php_options) 

    或者如果你只想要一个请求,或者你想要使用一个表单,你可以调用你的PHP和PHP内部,你可以创build一个HTTP或networking请求,从PHP的node.js ,如:

     // this is php new HttpRequest('http://node.youtsite.com/push', HttpRequest::METH_GET); 

使用:

  • 定期的MongoDBcollections作为商店
  • 可以用Tailble游标作为队列的 MongoDB封顶集合 ,
  • 带有Socket.IO的节点工作人员将队列视为工作人员
  • 一个Node服务器为Socket.IO客户端提供页面服务,并接收POST数据(或者其他数据被添加)作为服务器

它如下所示:

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

这是从数据的最初添加到客户端收据的“推送” – 无需轮询,因此可以实时获得每个步骤的处理时间。

Re:在MongoDB中触发器 – 请看这个答案: https : //stackoverflow.com/a/12405093/1651408

在MySQL中有更方便的触发器,但是从它们调用Node.js需要使用MySQL UDF( 用户定义函数 )的一些工作,例如通过Unix套接字来推送数据。 请注意,这只有在其他应用程序(除了Node.js进程)正在更新数据库时才是必需的,并且在这种情况下一定要selectInnoDB作为存储(行级与表级locking)。

可以看到你的技术selectsockets.io没有大的问题,即使不支持客户端networking套接字 ,你会退后(优雅地,我希望)投票。

最后,你的问题并不是愚蠢的,因为推动技术肯定比投票请求的泛滥要好 – 它的规模更好。 编辑:但是,不会描述任何技术作为实时

另一个编辑:这种相当知名和成功的设置,请阅读这个: http : //blog.fogcreek.com/the-trello-tech-stack/

你有没有发现胆碱 ? 它与您的networking服务器分开工作,并通过使用HTTP POST来与之连接。 这样,你可以编写你的networking应用程序任何你想要的方式。

实际上使用像Socket.IO推技术可以帮助您使用

有效的服务器资源,还可以帮助您利用旧的浏览器,以现代的浏览器做websocket或类似websocket的连接。

10秒轮询是一个HTTP请求 ,特别是当很多用户出现时,这个HTTP请求很贵的

与轮询技术不同, 推送技术相对便宜。 用户的客户端正在打开一个专用的套接字(即websocket)来监听服务器的推送通知。

通常你的客户端JavaScript在收到推送通知的时候会做一些操作。

使用你的LAMP堆栈和Socket.IO与不同的端口(80以外)将足以实现你所需要的。

但是使用Node.js + MongoDB + Socket.IO实际上可以帮助您更有效地pipe理服务器的资源。

因为这三个有非阻塞性质。

如果您正确理解非阻塞概念并适当地实现您的应用程序,

你的相同的应用程序,具有相同的function,但具有不同的语言和不同的数据库的应用程序将能够处理比一般的LAMP堆栈更多的请求。


在这里输入图像描述

以上图片是比较非阻塞与线程方式处理并发的着名图表

Apache(线程)与Nginx(非阻塞)


MySQL是一个伟大的数据库。 我相信你不需要jointransactions实时通知。

除非您自己实现类似的function,否则MongoDB不具备这两个function。

由于没有这两个特性,MongoDB可以比传统的SQL数据库更快地存储数据。

从MySQL切换到MongoDB将减less插入和获取数据的时间。

与JS你可以打开一个套接字到您的服务器(不是旧的浏览器),服务器将有一个ah-hoc程序(在特设的端口,所以你需要权限打开门,并运行在您的服务器上的程序),这将(几乎)实时地向客户端发送数据,并且没有HTTP的协议开销.old浏览器将回退到轮询机制。

我不能看到其他方式做到这一点(可能已经有“coocked”框架这样做)

Interesting Posts