stomp协议中heartbeat有什么用?

What is the use of heartbeat in stomp protocol?

目前我正在使用 stomp 协议向 activeMQ 发送消息并收听消息。这是在 Nodejs 中使用 stompit 库完成的。

当应用程序 CPU 或内存使用率很高时,它会停止向代理发送检测信号。所以broker重新投递当前正在处理的消息,导致重复处理同一条消息

在禁用心跳时,应用程序似乎工作正常,但我不确定禁用心跳可能会导致的进一步问题。即使代理在发送消息时停止,无论有无心跳,行为似乎都相同

我读到它是一个可选参数,但我无法找到它的确切用例

谁能提到没有心跳会导致应用程序出现问题的场景?

关于心跳的目的 STOMP 1.2 specification 只是说:

Heart-beating can optionally be used to test the healthiness of the underlying TCP connection and to make sure that the remote end is alive and kicking.

心跳可能从客户端流向服务器,也可能从服务器流向客户端,因此此处规范中引用的“远程端”可能是客户端或服务器。

对于服务端来说,心跳有助于确保及时清理服务端资源,避免过度紧张。为所有客户端连接维护服务器端资源,它帮助代理能够在这些连接失败时快速检测(即未收到心跳),因此它可以清理这些资源。如果禁用心跳,则可能无法检测到死连接,并且服务器将不得不徒劳地为该死连接维护其资源。

对于客户端,心跳有助于在执行异步发送时避免消息丢失。消息通常由客户端异步发送(即即发即弃)。如果没有检测连接丢失的机制,客户端可以继续在死连接上异步发送消息。这些消息将丢失,因为它们永远不会到达代理。心跳缓解了这种情况。