目录
摘要:如何构建商业级聊天系统。 不要让您的服务变成小猪佩奇。 师父陷入困境,却神秘地将兄弟姐妹、弟弟妹妹、叔叔阿姨聚集在一起。 与他们聊天以生存。 例如,这不仅仅是保活。 事实上,我们的很多系统在需要确定对方是否可以进行通信时,都需要这种保活机制。
【如何构建商业级聊天系统】MQTT 第 5 部分:Keep Alive,别让你的 MQTT 服务变成小猪佩奇。
特别的赤莲师父!死了,留下了,神秘的联系
兄弟姐妹,弟弟妹妹,叔叔阿姨们~
请讲一点八卦
请活下去。 MQTT 并不是唯一需要 keepalive 的应用程序。 事实上,我们需要活下去。 许多系统需要确定对方是否可以进行通信。需要这种keepalive机制。 例如,在音频聊天中,音频聊天和服务器两方也需要keepalive机制来判断双方的状态进行相应的处理。
了解保活对于指导系统设计非常重要。
MQTT 的保持活动机制
为什么 MQTT 应该保持活动状态?
TCP 半开连接问题,半 - 打开。
首先,MQTT 是基于 TCP 协议的,因此 TCP 的可靠性、有序性、错误检测等特性也适用于 MQTT。
但是,使用 TCP 连接的通信方之间的传输可能不同步。
例如,如果通信过程中发生一侧崩溃或传输错误,这种不完整的连接状态称为“half - open”
所以问题是,如果一个崩溃,另一个不会被通知。 仍然连接的一方将继续发出请求并等待响应。 这对于仍然连接的一方来说显然是一次糟糕的体验,或者说是不合理的。
这是 MQTT 的发明者 Andy Stanley-Clark 描述的方法。
为了进一步阐明规范,keepalive 的目的是确保底层连接在应用程序级别(客户端应用程序和代理)仍然处于活动状态。 从头到尾。 理论上,TCP/IP 会在套接字损坏时通知您,但在实践中,尤其是在移动或卫星链路等情况下,TCP 通常会通过空中“伪装”并返回。两端。 如果您查看标头,您的 TCP 会话很可能已成为“黑洞”。 也就是说,会议似乎仍然开放,但实际上它只是扔掉了地上写的所有内容。
keepalive 从而确认它实际上仍在与代理通信(从代理的角度来看,客户端确实仍然处于连接状态)特别是如果您有较长的连接,订阅不经常发布的主题,或发布到 qos0 上的代理(即无确认)。
代理响应客户端发起的“ping-req”返回的 ping-resp(“pong”!) 应该用于告诉应用程序(“pong”!)连接是否丢失或触发重连。
MQTT 包含这样一个“keepalive”功能,它为 half-open 问题的解决方案,或者为判断连接是否断开提供了评估依据。
Keepalives 确保代理和客户端之间的连接仍然打开,并且代理和客户端知道它们彼此连接
具体行为是,客户端与服务器建立连接后,每隔几秒与服务器进行通信。 该时间间隔定义了客户端和服务器之间没有通信的最长时间。
MQTT 定义如下。
“Keepalive...是客户端完成发送一个控制数据包并开始发送下一个控制数据包之间允许经过的最大时间间隔。” 要点:客户端有责任确保发送控制报文的时间间隔不超过keepalive。价值。 如果客户端不发送其他控制数据包,则必须发送 PINGREQ 数据包。 ”
换句话说,保活是指客户端完成发送数据包的时刻。 下一个传输的数据包之间允许的最大时间间隔。
只要在该时间范围内频繁交换消息,客户端就必须准确发送 PINGREQ 数据包。 当由 keepalive 定义时,不需要发送额外的消息来确认连接。
但是,如果客户端在此期间没有发送任何消息,则必须发送 PINGREQ 数据包进行确认。
如果代理在 1.5 倍的 keepalive 时间间隔内没有收到来自客户端的消息或 PINGREQ keepalive 数据包,则客户端将断开连接。 如果在合理时间内未收到响应,这同样适用于客户。 代理响应也会关闭连接。
保持活动流程
使用两个数据包确保保持活动功能:PINREQ 和 PINGRESP
PINREQ 由没有有效负载的客户端。 客户端可以随时发送此数据包来检查连接状态。
当服务器收到PINGREQ数据包时。 ,它应该响应以指示 PINGRESP 数据包仍然可用。 相同的 PINGRESP 不包含有效负载
您需要了解的内容
如果客户端在 keepalive 期间没有向服务器代理发送任何数据包或 PINGREQ,则代理 LWT 会关闭连接。最后(如果由客户端配置)。 MQTT 客户端负责设置适当的保活值。 例如,这是可能的。根据当前信号强度调整保活间隔。 最大保活间隔为 18 小时 12 分 15 秒。 如果keepalive间隔为0,则keepalive机制被禁用。
客户端任务 -接管客户端接管
通常,客户端可以在断开连接后重新连接。 在某些情况下,broker 服务器可能仍然向客户端提供半-开的连接(例如,在 1.5 个 keep-alive 间隔内,客户端尝试断开连接并重新连接,但此时有两个客户端已连接) 。 在 MQTT 中,当代理检测到半开连接时,它会执行客户端接管。 代理断开之前的连接并与客户端建立新的连接。 此行为可确保半打开连接。 不会阻止客户端断开连接和重新连接。
评论前必须登录!
注册