JavaScript中对socket.io的订阅太多

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript中对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条消息,我需要在客户端处理这个问题。如果是这样,我应该担心收到的消息量是多少?如果可能的话,任何处理高速传入消息的技术/策略?

答案

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。进一步的建议需要看看你正试图用这些消息做什么。

更好的方法是找到一种方法来限制发送给每个客户端的消息数量,方法是更聪明地了解您订阅的内容,找到配置订阅以便不向您发送这么多内容的方法,或者创建一个介入的服务器拥有可以更聪明地发送给每个客户端的内容。

以上是关于JavaScript中对socket.io的订阅太多的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Socket.IO 中模拟连接失败

在 useEffect 中对 Socket.io 的第一个请求做出反应

Socket.IO 订阅多个频道

GraphQL 订阅与 socket.io

如何将 socket.io 与 graphql 订阅一起使用?

Socket.io的连接太多