STOMP协议中心跳的作用是什么?

3

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

当应用程序CPU或内存使用率很高时,它会停止向代理发送心跳信号。因此,代理会重新传递当前正在处理的消息,导致重复处理相同的消息。

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

我已经阅读过它是可选参数,但我无法找出它的确切用例。

有人能提到没有心跳可能会对应用程序造成问题的情况吗?

1个回答

3
关于心跳的目的,STOMP 1.2规范只是简单地说:
“可以选择使用心跳来测试底层TCP连接的健康状况,并确保远程端处于活动状态。”
心跳可能从客户端到服务器和从服务器到客户端都会发送,因此规范中提到的“远程端”可以是客户端或服务器。
对于服务器,心跳很有用,可以确保及时清除服务器端资源以避免过度压力。服务器端资源为所有客户端连接维护,它有助于代理快速检测这些连接失败(即没有接收到心跳),以便清除这些资源。如果禁用心跳,则可能无法检测到死亡连接,服务器将不得不为那个死亡连接继续维护其资源,这是徒劳的。
对于客户端,心跳有助于在执行异步发送时避免消息丢失。客户端通常异步发送消息(即发送并忘记)。如果没有机制来检测连接丢失,客户端可能会在死亡连接上继续异步发送消息。由于这些消息永远不会到达代理,所以它们将会丢失。心跳可以缓解这种情况。

明白了,感谢你详细的回答。但是当应用程序崩溃时,我该如何防止消息的重新传递,以避免重复处理呢? - Sangeeth Mukundan
为了防止重新交付,了解为什么会发生这种情况是至关重要的。我建议您为此创建一个新问题,以便您可以提供所有细节。 - Justin Bertram
嗨Justin,我对这个问题有疑问,如果服务器心跳被禁用,那么在这种情况下无法检测到断开的连接。 当Node.js服务器停止从队列中消费时,经纪人如何显示消费者为0? - Sangeeth Mukundan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接