目前我正在使用stomp协议向activeMQ发送消息并监听消息。这是在Nodejs中使用stompit库完成的。 当应用程序CPU或内存使用率很高时,它会停止向代理发送心跳信号。因此,代理会重新传递当前正在处理的消息,导致重复处理相同的消息。 禁用心跳后,应用程序似乎工作正常,但我不确定禁用心跳可能会引起哪些进一步问题。即使在发送消息时停止代理,行为似乎与有无心跳相同。 我已经阅读过它是可选参数,但我无法找出它的确切用例。 有人能提到没有心跳可能会对应用程序造成问题的情况吗?
关于心跳的目的,STOMP 1.2规范只是简单地说:“可以选择使用心跳来测试底层TCP连接的健康状况,并确保远程端处于活动状态。”心跳可能从客户端到服务器和从服务器到客户端都会发送,因此规范中提到的“远程端”可以是客户端或服务器。对于服务器,心跳很有用,可以确保及时清除服务器端资源以避免过度压力。服务器端资源为所有客户端连接维护,它有助于代理快速检测这些连接失败(即没有接收到心跳),以便清除这些资源。如果禁用心跳,则可能无法检测到死亡连接,服务器将不得不为那个死亡连接继续维护其资源,这是徒劳的。对于客户端,心跳有助于在执行异步发送时避免消息丢失。客户端通常异步发送消息(即发送并忘记)。如果没有机制来检测连接丢失,客户端可能会在死亡连接上继续异步发送消息。由于这些消息永远不会到达代理,所以它们将会丢失。心跳可以缓解这种情况。