使用 express.js 和 socket.io 构建推送通知系统的最佳方法

Posted

技术标签:

【中文标题】使用 express.js 和 socket.io 构建推送通知系统的最佳方法【英文标题】:Best way to build push notification system using express.js and socket.io 【发布时间】:2016-04-02 03:49:38 【问题描述】:

我将 express.js 和 socket.io 一起用于实时推送通知系统。工作正常,我分享了我在服务器端使用的一些代码行

 var app = express();
 var server = require('http').Server(app);
 var io = require('socket.io')(server);
 server.listen(appconfig.webPort, function() 
  console.log('server runing at ' + appconfig.webPort);
 );

 io.on('connection', function(socket) 
   var id = setInterval(function() 
    some database logic here to get data from database  
       socket.emit(data);
  , 5000);
 );

我的问题是这段代码会增加服务器的负载吗?因为我每隔几秒钟就从数据库中获取数据。 如果它是有害的,那么最好的方法是什么。

【问题讨论】:

【参考方案1】:

我的问题是这段代码会增加服务器的负载吗?当我得到 每隔几秒钟从数据库中获取数据。如果它是有害的,那是什么 最好的方法。

当然会增加负载。对于与您的服务器建立的每个 socket.io 连接,您将启动一个单独的 5 秒间隔计时器,并且在每次触发该计时器时,您正在运行一个或多个数据库查询,然后将这些结果发送到该客户端。

如果您有 50 个连接的客户端,您将每 100 毫秒 (5000 / 50) 运行一次这些查询。如果您有 1000 个连接的客户端,则平均间隔是每 5 毫秒。除了让您的数据库非常忙碌之外,您的服务器也会非常忙碌。如果您有数千个连接的客户端,扩展会迅速恶化。

如果您为每个客户获取相同的数据,那么您应该改变执行此操作的方式。每 5 秒对数据库进行一次查询,然后将相同的结果发送给所有客户端。这可以扩展很多,好多了。

如果您可以完全避免轮询数据库并依靠某种事件触发器来检测更改,那通常效果会更好。

【讨论】:

谢谢,但所有用户或客户的数据都不同。 facebook 或任何其他应用程序如何管理他们的通知,因为每个用户都有自己的通知。\ @Meesam - 关键是在服务器上创建一个通知系统,这样当与给定用户相关的事件发生时,它们只会发送给该用户,并且没有任何东西定期轮询数据库。如何做到这一点完全取决于应用程序、数据存储结构、特定的及时性要求和一堆其他架构方面的东西。在某些情况下,后端存储必须专门设计为支持正确类型的通知而无需轮询。它会定期轮询,在 99% 的情况下没有发现会影响可扩展性的情况。 :- 如果我没记错的话,你要求创建两种策略,一种是专门用于通知,另一种是用于应用程序功能。 @Meesam - 我不知道你为什么这么说。零种轮询是期望的结果,而不是两种。

以上是关于使用 express.js 和 socket.io 构建推送通知系统的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Express.js 'socket.io/socket.io.js 404'

使用 Express.js v4 和 Socket.io v1 的会话

在 Express.js 项目中使用 Socket.io

javascript Express.js和Socket.io使用相同的端口

如何结合 Express.JS 使用 Socket.io(使用 Express 应用程序生成器)

Express.js、bin/www 设置和 Socket.io