【问题标题】:Best way to build push notification system using express.js and socket.io使用 express.js 和 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);
 });

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

【问题讨论】:

    标签: express push-notification socket.io push


    【解决方案1】:

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

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

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

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

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

    【讨论】:

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