JavaScript中对socket.io的订阅太多

时间:2018-05-06 14:09:34

标签: javascript jquery socket.io

我正在使用由供应商使用socket.io提供的流,使用以下代码:

var socket = io.connect('https://streamer.vendor-company.com/');
var subscription = ['sub1', 'sub2', 'sub3', 'sub4'];
socket.emit('SubAdd', { subs: subscription });
socket.on("m", function(message) {
    console.log(message);
    var messageType = message.substring(0, message.indexOf("~"));
    if (messageType == someMessageType) {
        dataUnpack(message);
    }
    else if (messageType == otherMessageType) {
        anotherDataUnpack(message);
    }
});  

方法dataUnpack和anotherDataUnpack对收到的消息执行一些处理并显示到网页。现在,数组subscription可能有大约45个订阅。

我想知道我网站上对效果的影响。 socket.io是否有一些方法可以避免充斥客户端,还是有任何严重的性能考虑? socket.io是否为此类用途而设计?

更新

这与:Too many on-connection events with Socket.io, does it hurt?不同,因为我的是Javascript / jquery,我给链接的问题是node.js。

服务器不受我的控制。看看jfriend00的答案,似乎如果我有50个订阅并且我每秒收到大约20-30条消息,我需要在客户端处理这个问题。如果是这样,我应该担心收到的消息量是多少?如果可能的话,任何处理高速传入消息的技术/策略?

1 个答案:

答案 0 :(得分:3)

  

socket.io是否有办法不充斥客户端

没有。如果您的服务器向客户端发送消息,则socket.io会将其传递给客户端。这完全取决于您的服务器发送了多少消息,而socket.io的工作就是提供您告诉它发送的每一封消息。

  

还是有任何严肃的性能考虑?

如果向大量客户发送大量消息,则可能需要大量处理和带宽。 socket.io只是webSocket上的一个消息传递层,它是TCP之上的一个层。因此,如果您将socket.io消息从服务器发送到客户端或从服务器发送到所有客户端,则它将一个或多个TCP数据包发送到客户端。不淹没客户端的唯一方法是让服务器不要发送超出其想要或可以处理的内容。

  

socket.io是否设计用于此类用途?

Socket.io旨在可靠地将消息从服​​务器传递到客户端或客户端到服务器。它就是你告诉它的。如果你告诉它传递1000条消息,它将会发生什么。

如果您担心有太多邮件被发送到客户端,那么您需要修改服务器来控制它。例如,您可能决定不应每5秒钟通知客户端一次(出于效率原因)。要实现这一点,您需要在服务器上添加一个额外的层(您自己设计)。这不是socket.io具有内置功能的东西。

如果您每个订阅每秒获得20-30封邮件,并且每个客户端有50个订阅,则每个客户端每秒有1000-1500封邮件。这确实很多,可能在客户端或服务器端都不可持续,特别是在服务器端,因为你会让很多客户都做同样的事情。每秒1000条消息,您必须在1毫秒内处理一条消息,以防止落后。

除了非常小心地限制每条消息到达时的操作时,没有特殊的技术来处理高速率的传入消息。例如,您不希望在每条消息上触摸浏览器DOM。也许你会将它们排队并且每秒只批量修改一次DOM。进一步的建议需要看看你尝试对这些消息做些什么。

更好的方法是找到一种方法来限制发送到每个客户端的消息数量,方法是更明智地了解您订阅的内容,找到配置订阅以便不向您发送的消息或创建干预的方法您自己的服务器,可以更聪明地发送给每个客户端。