【问题标题】:Advantage/disadvantage of using socketio heartbeats使用 socketio 心跳的优点/缺点
【发布时间】:2011-08-15 03:07:16
【问题描述】:

Socket.io 允许您使用心跳来“检查 Socket.IO 连接的健康状况”。心跳到底是什么?为什么应该或不应该使用它们?

【问题讨论】:

    标签: node.js websocket socket.io


    【解决方案1】:

    心跳是从客户端定期发送到服务器(或从服务器到客户端并返回到服务器)的小消息,以确认客户端仍然存在并且处于活动状态。

    例如,如果您有一个 Node.js 应用程序为聊天室服务,而用户在几分钟内没有说任何话,则无法判断他们是否真的仍然处于连接状态。通过以预定的时间间隔(例如,每 15 秒)发送一次心跳,客户端通知服务器它仍然存在。如果是例如自从服务器收到来自客户端的心跳 20 秒后,它可能已断开连接。

    这是必要的,因为您cannot be guaranteed a clean connection termination over TCP--如果客户端崩溃或发生其他事情,您将不会收到来自客户端的终止数据包,并且服务器不会知道客户端已断开连接。此外,Socket.IO 支持各种其他机制(除了 TCP 套接字)来传输数据,在这些情况下,客户端不会(或不能)向服务器发送终止消息。

    默认情况下,Socket.IO 客户端会每 15 秒(心跳间隔)向服务器发送一次心跳,如果服务器在 20 秒内没有收到客户端的消息(heartbeat timeout)它会认为客户端已断开连接。

    我想不出很多你可能不想使用心跳的普通用例。

    【讨论】:

    • 可能值得澄清为什么需要它们?为什么服务器不会通过onclose 事件/回调检测到客户端断开连接?
    • 值得注意的一个缺点是间隔和心跳之间的增量很小,在负载下,服务器可能无法及时响应心跳包并假设连接已经死亡。跨度>
    • @jhchen 这种情况发生的概率是多少?有没有办法延长心跳后的测试时间?如果你这么说,5s 似乎并不像延迟连接上的很多时间。
    • @tester 确定控制这个的两个变量是“心跳超时”和“心跳间隔”,所以要么降低间隔,要么提高超时
    • 在使用无线网络连接的移动应用程序中,心跳间隔不应太短,否则您的电池会很快耗尽(例如,Node.js 默认的服务器到客户端的心跳间隔约为 25 秒不是很好)。有关详细信息,请参阅here
    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2012-06-07
    • 2011-02-25
    • 2010-09-08
    相关资源
    最近更新 更多