【问题标题】:Socket.io - how to use listenersSocket.io - 如何使用监听器
【发布时间】:2013-11-29 13:40:21
【问题描述】:

我已经四处寻找关于这个问题的答案,我不确定我是否以正确的方式解决这个问题。

我有一个 node.js 应用程序,它使用 socket.io 将数据从节点服务器推送和接收到客户端。大部分发送到nodejs的请求都是通过HTTP请求,而推送到网站的数据是通过socket接收的。

我目前对每个单独的监听器都有唯一的命名空间(例如,我有一个带有 cmets 的提要,这意味着我有 feed/{ID} 作为监听器并且每条评论都有 comment/{COMMENTID}。这意味着如果有 25 个提要帖子,我将有 26 个(包括提要)听众收听仅提要。

我不完全确定 socket.io 如何通过侦听器推送数据(每个侦听器都是一个新的套接字吗?)。在我看来,如果我同时有大量用户在线和单个 cmets 侦听器,它将多次受到无用、不相关数据的打击——相比之下,现在它只会接收与用户相关的数据。

设置监听器的最佳方式是什么?

更多或更少的听众有益吗?

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    您应该使用房间来处理这个问题。每次用户查看提要页面时,它都会注册到一个房间,然后您根据他们实际看到的页面仅将相关信息推送给用户。

    socket.on('subscribe', function(data) { socket.join(data.room); }); socket.on('unsubscribe', function(data) { socket.leave(data.room); });

    那么当你想向特定房间发送信息时

    io.sockets.in('feed_1').emit('comment', data);
    

    您可以在此处查看文档:https://github.com/LearnBoost/socket.io/wiki/Rooms

    【讨论】:

    • 感谢您的回答!我确实知道这一点,虽然在设置它时没有想到它,但我可能会重构我的代码以现在使用它。但是,我想了解的是,您创建的每个侦听器都会打开一个新连接吗?这是否意味着您应该只运行 1 或 2 个侦听器?对于“存在”和“消息”等功能,我还有其他单独的侦听器。
    • 每个客户端与服务器只有一个连接。 Socket.io 将根据您在socket.on 或socket.emit 中作为第一个参数提供的密钥使用正确的侦听器
    • 那么有一个不同的听众名单重要吗?拥有一堆不同的侦听器与单个侦听器相比有哪些性能问题?
    【解决方案2】:

    这是使用监听器的一种不好的方式。你应该只使用

    • socket.on('feed',feed)
    • socket.on('comment',comment)

    当您想向提要侦听器发送数据时,请使用“socket.emit('feed',{id:1})”。 当您想向评论监听器发送数据时,请使用“socket.emit('comment',{commentid:1})”

    这将使您减少到只有 2 个听众。

    【讨论】:

    • 如果我有 50,000 个组供稿和 50,000 个用户供稿怎么办?那么无论您正在查看哪个页面,您都会获得完全不相关的提要更新?为什么单个听众会发送给潜在的 50,000 名用户而不是多个听众与 3,000 人相比更好?
    • 这是您的服务器的工作,以确定您应该将 socket.emit 发送给哪个用户。您不应该将 socket.emit 发送给所有用户。更多的侦听器意味着要为您的服务器添加更多的工作来检查每个纳秒/毫秒(基于您的服务器性能来运行每个事件循环。这是 node.js 的主要概念。)您应该仅在您的提要有更新时检查发送事件/comment 只给参与其中的人会带来更好的表现。
    • 感谢您的回答,据我了解,socket.emit 将发送到连接到套接字的任何连接,无论其侦听器是什么。设置“房间加入”保持服务器端连接的一组套接字,并且只向已注册房间的用户发出信号
    猜你喜欢
    • 2016-08-29
    • 2022-01-17
    • 1970-01-01
    • 2017-11-03
    • 2023-01-13
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多